提问人:yonutix 提问时间:10/24/2023 最后编辑:yonutix 更新时间:10/28/2023 访问量:140
C++ 观察器设计模式,防止对象被重新分配
C++ Observer design pattern, prevent object from being reallocated
问:
由于在某些情况下对象被重新分配,例如在 std::vector 的情况下,C++ 可观察模式实现可能会有问题:
根据“四人帮”一书,可观察对象的实现如下所示:
class ObservableSubject {
public:
virtual ~ObservableSubject() = default;
virtual void notify() = 0;
protected:
ObservableSubject() = default;
private:
std::vector<Observer*> mObservers;
};
其中 Observer 如下所示:
class Observer {
public:
virtual ~Observer() = default;
virtual void update(ObservableSubject& subject) = 0;
protected:
Observer() = default;
};
考虑这个例子:
class Mapper final: public Observer {};
当 Mapper 被这样持有时,一旦重新分配内存,持有的指针就会失效。
解决方案当然是使用指针(即 )并具有 .此解决方案可能会有问题,因为开发人员必须记住 Mapper 不能重新分配。std::vector<Mapper>
mObservers
std::vector<Mapper>
std::shared_ptr
std::vector<std::shared_ptr<Mapper>>
有没有办法约束 C++ 中的类不被重新分配?
答:
1赞
Jarod42
10/24/2023
#1
您可以禁止构造函数并创建工厂返回智能指针:
class Mapper final: public Observer {
// Pass-key idiom to allow `std::make_unique` usage
class private_key {
private_key() = default;
};
public:
Mapper(private_key) {}
Mapper(const Mapper&) = delete;
Mapper(Mapper&&) = delete;
static std::unique_ptr<Mapper> create() { return std::make_unique<Mapper>(private_key{}); }
// ...
};
所以对象的地址是“稳定的”。
评论
std::vector<Observer *>
Observer *
class ObservableSubject
=delete