子对象是否有指向其父对象的错误做法?

Ale*_*rty 13 c++ oop

在C++应用程序中,假设我有一个窗口类,它有几个控件类实例.如果我的窗口想要通知控件已被单击,我可能会使用:

control[n]->onClick();
Run Code Online (Sandbox Code Playgroud)

现在让我们说控件需要知道它的父窗口的大小,或者其他一些信息.为此我正在考虑给控件一个指向自身(this)的指针作为它的构造函数的参数.然后我会从控件onClick()方法中调用这样的调用:

Size windowsize = parent->getSize();
Run Code Online (Sandbox Code Playgroud)

这会被视为不良做法,还是以任何其他方式与面向对象编程的价值相矛盾?如果是这样,他会采取什么样的"正确"方式?

作为一个附带问题,有一个Class或Class*的向量会更好吗?是否值得增加速度增益的复杂性?(向量的变化很少).

Jam*_*lis 11

您可以将控件层次结构视为树状图形数据结构; 当你以这种方式可视化时,控件有一个指向其父级的指针是非常合理的.

至于对象或指向对象的指针是否应存储在向量中,这取决于它.您通常应该更喜欢存储对象,但有很多时候您不能这样做,或者这样做是不切实际的.例如,如果您需要利用多态性并存储所有派生自公共基类的不同类型的事物,则需要使用指针.

如果你存储指针,请确保使用某种智能指针或指针容器; 否则,异常安全是一种殴打.


Mar*_*ade 8

没关系.这是UI框架中的常见模式.例如,.NET Windows Forms Control类具有用于指定父级的构造函数(http://msdn.microsoft.com/en-us/library/wawy06xc.aspx).


Chu*_*dad 6

事实上,GOF Composite设计模式基于Explicit Parent References.

显式父引用.维护子组件到其父组件的引用可以简化组合结构的遍历和管理.父引用简化了向上移动结构和删除组件. 父引用也有助于支持责任链(223)模式.定义父引用的通常位置是Component类.Leaf和Composite类可以继承引用和管理它的操作.

对于父引用,必须保持复合体的所有子元素作为其父元素的不变量,而复合元素又将它们作为子元素.确保这一点的最简单方法是仅在组件添加或从组合中删除时更改组件的父组件.如果在Composite类的Add和Remove操作中可以实现一次,那么它可以被所有子类继承,并且将自动维护不变量.

因此,我想,根据实际需求和背景,这样的设计有一个明确的地方.


Pau*_*lik 5

不,完全没问题。唯一的问题是它增加了实例之间的耦合程度。另外,如果您考虑按照上面的建议使用智能指针,请确保引用父级“弱”。假设您的窗口树不太深,您可以考虑从已知的顶部窗口开始确定父级 dyuamica1ly。