C++ 观察者模式、智能指针和单例类

C++ 观察者模式、智能指针和单例类,c++,c++11,C++,C++11,我想使用智能指针创建一个观察者模式。这是我的班级: class Observable { public: void addObserver(std::shared_ptr<Observer> ptr); private: std::list<std::weak_ptr<Observer>> observers; }; 在这种情况下,我没有共享的ptr,但是singleton类可以是一个观察者。这是否意味着我需要从单例类返回一个共享的\u pt

我想使用智能指针创建一个观察者模式。这是我的班级:

class Observable {
public:
    void addObserver(std::shared_ptr<Observer> ptr);
private:
    std::list<std::weak_ptr<Observer>> observers;
};

在这种情况下,我没有共享的ptr,但是singleton类可以是一个观察者。这是否意味着我需要从单例类返回一个共享的\u ptr?有什么设计细节需要考虑吗?

我使用了不同的策略:

class ObserverWrapper: public Observer {
public:
  void notify() override {
      ref.notify();
  }
private:
  Observer& ref;
};

class ObserverProxy: public Observer {
public:
    operator std::shared_ptr<Observer>() {
       return wrapper;
    }
    ObserverProxy() : wrapper(std::make_shared<Observer>(*this) {
    }
private:
    std::shared_ptr<Observer> wrapper;
};

class Singleton: public ObserverProxy {
public:
  void notify() override {
      //something here
  }
};

我使用了不同的策略:

class ObserverWrapper: public Observer {
public:
  void notify() override {
      ref.notify();
  }
private:
  Observer& ref;
};

class ObserverProxy: public Observer {
public:
    operator std::shared_ptr<Observer>() {
       return wrapper;
    }
    ObserverProxy() : wrapper(std::make_shared<Observer>(*this) {
    }
private:
    std::shared_ptr<Observer> wrapper;
};

class Singleton: public ObserverProxy {
public:
  void notify() override {
      //something here
  }
};

如果要将
共享的\u ptr
作为单例类返回,请注意线程安全。使用
std::make_shared
创建指针在默认情况下不是线程安全的,您应该自己处理它。您的意思是拥有这样的东西吗
static std::shared_ptr=std::make_shared()
?@greywolf82使用shared_ptr应该在某一天自动删除指向的对象。但是对于单例,您确实不希望发生这种情况(静态分配)。我对两种设计选择不兼容感到震惊。@prog fh我也有同样的感觉@Gupta的评论似乎是一种解决方案。只需返回此静态共享\u ptr的副本,以便此静态变量始终至少引用一次单例,但不复制(仅共享\u ptr)如果要将
shared\u ptr
作为单例类返回,请注意线程安全。使用
std::make_shared
创建指针在默认情况下不是线程安全的,您应该自己处理它。您的意思是拥有这样的东西吗
static std::shared_ptr=std::make_shared()
?@greywolf82使用shared_ptr应该在某一天自动删除指向的对象。但是对于单例,您确实不希望发生这种情况(静态分配)。我对两种设计选择不兼容感到震惊。@prog fh我也有同样的感觉@Gupta的评论似乎是一种解决方案。只需返回此静态共享\u ptr的副本,以便此静态变量始终至少引用一次单例,但不复制(仅共享\u ptr)
Singleton& s = Singleton::getInstance();
Observable obs;
obs.addObserver(s);