【发布时间】:2018-02-27 17:31:49
【问题描述】:
假设我有两个班级:FirstContainer 和 SecondContainer
它们对ThirdContainer 类拥有相同的引用(传入它们的构造函数)。
FirstContainer 和 SecondContainer 有以下方法:
- addMemberToThirdContainer
- delMemberOfThirdContainer
- getThirdContainerMembers
修改 ThirdContainer 后,我希望另外两个使用 getThirdContainerMembers() 进行更新。为此,我使用了观察者/监听者模式。
ThirdContainer 有一个监听器列表和一个方法:addNewListener。
FirstContainer 和 SecondContainer 注册:mThirdContainer.addNewListener(this);
我不确定这是不是这样做的好方法,我是面向对象的新手。
我还有什么其他可能实现这样的目标?
我不执着于我所说的任何东西,它只是在这里,因为我很难解释我想做什么。我希望这很清楚。
感谢您的帮助,
最好的,
编辑:
使用前向声明怎么样?我可以这样做:
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。
我会收到通知。我的意思是我猜....
【问题讨论】:
-
这两个对象是否共享第三个对象的所有权?还是他们需要一个非拥有的指针或对第三个对象的引用?
-
首先,一个简短的语言挑剔:一个类描述了这个类的实例的样子。类和其他类型(指针、整数等)的实例是对象。这只是为了弄清楚含义,因为“在两个类之间共享对象”有点不清楚。现在,关于您的问题,无法判断您所描述的是否聪明,因为信息太少了。我建议你从你想要达到的目标开始,而不是从可能有缺陷的方法开始。
-
FirstContainer 和 SecondContainer 不应拥有对 ThirdContainer 的所有权。 ThirdContainer 是一种模型,即使没有其他两个它也应该存在(相反是错误的)。感谢您的帮助
-
嘿 ulrich,我想要的是让两个类与第三类的同一个实例进行通信。并且每当在共享实例中进行更改时,都会通知共享它的类。将来,这两个类可能会共享多个第三类的实例。
标签: c++ c++11 observer-pattern constructor-injection