由于在某些情况下对象会被重新分配,例如在 std::vector 的情况下,C++ 可观察模式实现可能会出现问题:
根据“四人帮”一书,可观察对象的实现如下所示:
class ObservableSubject {
public:
virtual ~ObservableSubject() = default;
virtual void notify() = 0;
protected:
ObservableSubject() = default;
private:
std::vector<Observer*> mObservers;
};
观察者看起来像这样:
class Observer {
public:
virtual ~Observer() = default;
virtual void update(ObservableSubject& subject) = 0;
protected:
Observer() = default;
};
考虑这个例子:
class Mapper final: public Observer {};
像这样持有Mapper
std::vector<Mapper>
,一旦mObservers
重新分配内存,std::vector<Mapper>
中持有的指针就会失效。
解决方案当然是使用指针(即 std::shared_ptr
)并具有 std::vector<std::shared_ptr<Mapper>>
。这个解决方案可能会有问题,因为开发人员必须记住 Mapper 无法重新分配。
有没有办法限制C++中的类不被重新分配?
您可能不允许构造函数并创建一个返回智能指针的工厂:
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{}); }
// ...
};
所以对象的地址是“稳定的”。