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);