2010-11-04 94 views
1

成员函数访问建议我有4个班以下层次结构的:C++:在同样的体系结构层

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

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

我想过把查找表本身作为一个类来实现,但是loop-up表的内容与BlockA的初始化稍有联系,并且将表从BlockA中解耦出来可能不是微不足道的仍然可行,但不是首选)。现在我的解决方案是将请求从BlockBBlockC传递到MyTop,并让MyTop管理块之间的通信。但是,当有更多的块需要访问BlockA中的查找表时,处理此问题似乎不是一种好方法。我想知道这是否是一个众所周知的问题,并且已经有一个“最佳实践”解决方案。谢谢!

回答

1

我想过实施 查表作为一个阶级本身,而是 循环表的内容是 稍微再加上 初始化BLOCKa中的,它可能 不平凡的从BlockA解耦表 (它仍然可行,但 不是首选)。

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

+0

我觉得这个表是一个单身人士。但是,我该如何授予对'BlockB'和'BlockC'的访问权限? (我知道单例模式,但从来没有自己实现过。) – YYC 2010-11-04 18:54:17

+0

只需提供一个静态函数,即可访问唯一实例。请参阅此实现,例如:https://bitbucket.org/sinbad/ogre/src/3ca441c19bd8/OgreMain/include/OgreSingleton.h – Klaim 2010-11-04 21:32:12

0

在当前机制下,BlockB和BlockC消耗BlockA中提供的设施。我的理解是,它与BlockA不同。他们不相提并论。

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

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

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

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

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

+0

+1的一般建议。 – YYC 2010-11-04 19:00:57