C ++:同一架构层的成员函数访问建议

时间:2010-11-04 18:20:05

标签: c++ architecture

我有以下层次的4个类:

                     MyTop
                       |
              -------------------
              |        |        |
            BlockA   BlockB   BlockC

BlockABlockBBlockCMyTop的组合对象。 BlockA提供了一个LookUpTable()函数,BlockBBlockC现在需要访问BlockA所拥有的查找表。 BlockBBlockC访问查找表有什么好(或至少是典型的)做法?

我考虑过将查找表作为一个类本身实现,但是循环表的内容与BlockA的初始化略有耦合,将表与表解耦可能并不简单。 BlockA(它仍然可行,但不是首选)。现在我的解决方案是将请求从BlockBBlockC传递给MyTop,让MyTop来管理块之间的通信。但是,当有更多块需要访问BlockA中的查找表时,这似乎不是一个好方法来处理问题。我想知道这是一个众所周知的问题,并且已经有了“最佳实践”解决方案。谢谢!

3 个答案:

答案 0 :(得分:1)

  

我考虑过实施   查找表本身就是一个类,但是   循环表的内容是   稍微加上了   BlockA的初始化,它可能   解开桌子并不容易   来自BlockA(它仍然可行,但是   不喜欢)。

难道你不能简单地让BlocA初始化那个查找表所有者对象吗?将BlocA作为朋友类,它将是一个单例(如果它在你的情况下是正确的),以确保它是唯一一个访问初始化(构造?)函数。

答案 1 :(得分:1)

我不知道是否有一般解决方案,但肯定有一般建议:tell, don't ask

从我所看到的,您正在尝试访问存储在查找表中的BlockA数据,然后对它们执行某些操作。这违反了封装原则,只有持有数据的对象才能访问和修改它。

更好的方法是将查找表功能提取到类中,并为所有三个块添加常用方法。然后创建查找表类的三个子类,并添加仅由特定块使用的方法(如果有任何此类方法)。在BlockA中,BlockBBlockC使用这些类。与访问直接存储在BlockA中的查找表相比,这允许更松散的耦合。

答案 2 :(得分:0)

使用当前机制,BlockB和BlockC使用BlockA中提供的功能。我的理解是它与BlockA不同。他们不相提并论。

BlockA,BlockB,BlockC继承了MyTop的方法。

  1. 所以LookUpTable()是MyTop的一种方法。
  2. 它应该访问仅在实例化BlockA时初始化的对象属性。