假设我有两个类:FirstContainer
和SecondContainer
它们对ThirdContainer
类具有相同的引用(在其构造函数中传递)。
FirstContainer和SecondContainer具有以下方法:
-addMemberToThirdContainer
-delMemberOfThirdContainer
-getThirdContainerMembers
修改ThirdContainer后,我希望其他两个使用getThirdContainerMembers()
进行更新。为此,我使用观察者/侦听器模式。ThirdContainer
具有侦听器列表和方法:addNewListener
。
通过执行FirstContainer
和SecondContainer
注册:
我不确定这是执行此操作的好方法,我是定向对象的新手。
实现这种目标的其他可能性是什么?
我不喜欢我所说的任何东西,它只是在这里,因为我很难解释我想做什么。我希望这很清楚。
谢谢您的帮助,
最好,
编辑:
什么使用前向声明回合?我可以做类似的事情:
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。
如果您不喜欢图书馆,则应尝试
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;
void addNewListener(shared_ptr<ThirdContainerListener> container) {
listeners.push_back(container); // Adds the pointer to the listeners
}
private: vector<int> list;
private: void callAllListeners() {
// Traverse through all the listeners
for(shared_ptr<ThirdContainerListener> listener: listeners) {
// Call each one's overridden function
listener->onContainerModified();
}
}
public: void addData(int d) {
list.push_back(d);
callAllListeners();
}
// Also you could make "removeDataByIndex", "addManyData", etc...
shared_ptr<ThirdContainer>
,以确保您的类不会泄漏内存或不指向任何内容(悬空指针)