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

标签 c++ c++14 shared-ptr

我正在尝试在 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/

相关文章:

c++ - 如何编写 C++ 控制台窗口程序

c++ - 我应该将哪个C++库用于利用第三方应用程序的大型并行计算数字处理项目

python - 尝试将数据从 C++ 发送到 Python 并使用套接字 C++、C++ sendto() 和 python recvfrom() 工作但不是反向

c++ - 从对象C++中的文件读取内容时发生段错误

c++ - 在运行时更改数组维度

c++ - 是否有一种可移植/符合标准的方法来获取堆栈跟踪中的文件名和行号?

c++ - 为什么有条件地编译一个运算符模板会改变另一个运算符的可用性?

c++ - 与 shared_ptr 相比,unique_ptr 的运行时数据结构更小,代码更快

C++:通过 std::weak_ptr 将委托(delegate)传递给其他对象

c++ - 返回作为 shared_ptr 的成员变量是否安全