代码之家  ›  专栏  ›  技术社区  ›  Alexander Rafferty

子对象有指向其父对象的指针是一种不好的做法吗?

  •  13
  • Alexander Rafferty  · 技术社区  · 14 年前

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

    control[n]->onClick();
    

    现在假设控件需要知道其父窗口的大小,或者其他一些信息。为此,我考虑给控件一个指向自身的指针(this)作为它的构造函数的参数。然后,我将从controls onClick()方法进行如下调用:

    Size windowsize = parent->getSize();
    

    这会被认为是不好的做法,或者以任何其他方式与面向对象编程的价值观相矛盾吗?如果是这样的话,他会怎样做才是“正确”的方法呢?

    作为一个附带问题,最好是类向量还是类*?它值得增加速度增益的复杂性吗?(对向量的更改很少)。

    7 回复  |  直到 14 年前
        1
  •  11
  •   James McNellis    14 年前

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

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

    如果确实存储指针,请确保使用某种类型的智能指针或指针容器;否则,异常安全就是一个问题。

        2
  •  8
  •   Mark Cidade    14 年前

    那很好。这是UI框架中的常见模式。例如.NET Windows窗体 Control http://msdn.microsoft.com/en-us/library/wawy06xc.aspx ).

        3
  •  6
  •   Zack The Human    14 年前

    事实上 GOF

    维护来自子对象的引用 简化遍历和管理 参考简化了向上移动 结构和删除组件。 父引用也有助于支持 责任链(223) 图案。 父引用在组件中 继承引用和 管理它的操作。

    有了家长的推荐,这是必不可少的 保持不变 把他们当作孩子。最简单的方法 仅当添加或 从合成材料中移除。如果可以的话 在Add和 类,则它可以被所有 子类和不变量将 自动维护。

    因此,我想,根据实际需求和上下文,这样的设计有一个明确的位置。

        4
  •  4
  •   Paul Michalik    14 年前

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

        5
  •  2
  •   Beth Lang    14 年前

        6
  •  1
  •   Little Endian    11 年前

    如果需要这样做,可以考虑将父级作为 const* .

        7
  •  0
  •   xis    11 年前

    还不错。例如,在Qt小部件中,即使不使用 const*

    顺便说一句:你说的“家长”可能会被家长误解,这让人有些困惑。