假设我有两个类:FirstContainerSecondContainer它们对ThirdContainer类具有相同的引用(在其构造函数中传递)。
FirstContainer和SecondContainer具有以下方法:
-addMemberToThirdContainer -delMemberOfThirdContainer -getThirdContainerMembers
修改ThirdContainer后,我希望其他两个使用getThirdContainerMembers()进行更新。为此,我使用观察者/侦听器模式。
ThirdContainer具有侦听器列表和方法:addNewListener
通过执行FirstContainerSecondContainer注册:

我不确定这是执行此操作的好方法,我是定向对象的新手。
实现这种目标的其他可能性是什么?
我不喜欢我所说的任何东西,它只是在这里,因为我很难解释我想做什么。我希望这很清楚。
谢谢您的帮助,
最好,

编辑:
什么使用前向声明回合?我可以做类似的事情:

 class ParentContainer {
 public:
     ParentContainer(ThirdContainer&)
     : mFirstContainer(*this), mSecondContainer(*this) { };

     ~ParentContainer();

     void addMemberToThirdContainer() {
        mThirdContainer.addMember();
        notify();
     };

     void delMemberOfThirdContainer() {
        mThirdContainer.delMember();
        notify();
     };

 private:
     std::vec<int>& getMemberOfThirdContainer() {
        return mThirdContainer.getMember();
     };

     void notify() {
        auto vec = getMemberOfThirdContainer();
        mFirstContainer.update(vec);
        mSecondContainer.update(vec);
     };

     ThirdContainer& mThirdContainer;
     FirstContainer  mFirstContainer;
     SecondContainer mSecondContainer;
 };

然后在FirstContainer和SecondContainer中类似:
 class ParentContainer;

 class FirstContainer {
 public:
      FirstContainer(ParentContainer&);
      ~FirstContainer();

      void update(std::vector<int>& vec);

 private:
      ParentContainer& mParentContainer;
 };

在FirstContainer和SecondContainer中,我将通过执行以下操作访问ThirdContainer:
mParentContainer.addMemberToThirdContainer和mParentContainer.DelMemberOfThirdContainer。
我会收到通知。我的意思是我猜....

最佳答案

如果您喜欢使用库,则可以使用任何提供Signal / Slot系统的库,例如Boost或Qt。

如果您不喜欢图书馆,则应尝试

  • 创建一个接口(interface)(在C++中,只是一个具有纯虚拟方法的抽象类,例如onModified:
    class ThirdContainerListener {
        public: virtual void onContainerModified() = 0;
        // Virtual: is to make it overridable
        //  = 0: is the C++ way to say "abstract",
        //         which means this function MUST be overridden.
    };
    
  • 为指向侦听器的指针制作一个vector(为安全起见,请尝试使用智能指针,例如shared_ptr){这位于ThirdContainer内}
    vector<shared_ptr<ThirdContainerListener>> listeners;
    
  • Make(也在ThirdContainer内),一个添加侦听器的函数,像这样
    void addNewListener(shared_ptr<ThirdContainerListener> container) {
        listeners.push_back(container); // Adds the pointer to the listeners
    }
    
  • 像这样隐藏您的真实容器
    private: vector<int> list;
    
  • 设置一个私有(private)函数来调用所有侦听器,以在本地使用
    private: void callAllListeners() {
        // Traverse through all the listeners
        for(shared_ptr<ThirdContainerListener> listener: listeners) {
            // Call each one's overridden function
            listener->onContainerModified();
        }
    }
    
  • Expose函数会修改您的容器,这些函数会调用所有侦听器,例如
    public: void addData(int d) {
                list.push_back(d);
                callAllListeners();
            }
    
    // Also you could make "removeDataByIndex", "addManyData", etc...
    
  • 在第一个和第二个容器中使用shared_ptr<ThirdContainer>,以确保您的类不会泄漏内存或不指向任何内容(悬空指针)
  • 10-08 00:41