gpt4 book ai didi

c++ - 如何创建 shared_ptr 的容器到抽象类

转载 作者:行者123 更新时间:2023-12-02 10:21:55 24 4
gpt4 key购买 nike

我正在尝试在 C++ 中创建一个主题观察者系统,就像 C# 中的事件系统一样。
观察者类:

template <class T>
class Observer {
int id;
public:
static int nextId;
Observer() : id(nextId++) {}
virtual void handleEvent(const T&) = 0;
virtual ~Observer();
};

学科类:
template<class T>
class Subject {
set<shared_ptr<Observer<T>>> observers;
public:
Subject() : observers() {}
void notify(const T&);
void addObserver(Observer<T>& );
void removeObserver(Observer<T>&);
Subject<T>& operator+=(Observer<T>&);
Subject<T>& operator-=(Observer<T>&);
Subject<T>& operator()(const T&);
};

问题是当我尝试实现 addObserver我不知道如何添加对集合的引用。

我了解 make_shared<Observer<T>>正在创建一个新实例,所以当我尝试 make_shared<Observer<T>>(observer)我在尝试创建抽象类时出错:

error: invalid new-expression of abstract class type ‘Observer’



我试过 shared_ptr<Observer<T>> observerPtr(observer)它也不起作用:

error: no matching function for call to ‘std::shared_ptr >::shared_ptr(Observer&)’



如何创建 shared_ptr从抽象类派生的对象的引用?

我想要实现的是让这个例子工作:
class TemperatureSensor : public Subject<int> {};

class AirConditioner : public Observer<int> {

static int nextId;
int id;

void onTemperatureChange(int temperature){
std::cout << "Air Conditioner #" << id << " got a report from TemperatureSensor, reading " << temperature << std::endl;
}

public:
AirConditioner() : Observer() {
id = (++nextId);
}

void handleEvent(const int& param) override {
onTemperatureChange(param);
}
};
int AirConditioner::nextId = 0;

int main(){
TemperatureSensor s;
AirConditioner a,b,c;

(((s += a) += b) += c);

s(42); // Should print:
// Air Conditioner #1 got a report from TemperatureSensor, reading 42
// Air Conditioner #2 got a report from TemperatureSensor, reading 42
// Air Conditioner #3 got a report from TemperatureSensor, reading 42
}

最佳答案

要回答有关实现 addObserver 的问题,使其工作的最简单方法是将指针存储在容器中:

template<class T>
class Subject {
set<Observer<T>*> observers;
public:
Subject() : observers() {}
void addObserver(Observer<T>& o) { observers.insert(&o); }


根据您希望如何管理观察者对象的生命周期,您可以使用 set<shared_ptr<Observer<T>>> ,但在这种情况下,您应该通过 share_ptr<Observer<T>>作为 addObserver(shared_ptr<Observer<T>>& o) 的参数.如果必须使用 addObserver(Observer<T>&)接口(interface)并且您希望“观察者”设置为共同管理观察者对象的生命周期,您可以使用 std::enable_shared_from_this 并使 Observer 成为 std::enable_shared_from_this 的子类。

希望这可以帮助。

关于c++ - 如何创建 shared_ptr 的容器到抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59788981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com