C++ 观察者设计模式,防止对象被重新分配

问题描述 投票:0回答:1

由于在某些情况下对象会被重新分配,例如在 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++中的类不被重新分配?

书中的实现:

c++ design-patterns c++17 c++20 c++23
1个回答
0
投票

您可能不允许构造函数并创建一个返回智能指针的工厂:

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

    // ...
};

所以对象的地址是“稳定的”。

© www.soinside.com 2019 - 2024. All rights reserved.