2

我有四个班级AB和。CD

  • A有一个b类 的成员B
  • B有一个c类的成员C

A有会员D* dpointer;

必须保留此层次结构(实际上,这是一个带有应用程序、窗口、面板AB的GUI C)。

现在 B 和 C 必须使用来自 的方法*dpointer

作为anddpointer的成员,还有什么比给予更优雅的吗?不好吗?BC

4

4 回答 4

2

不是直接的,但是您可以将 D 放在 ashared_ptr<D>中,这将减轻您可能遇到的任何内存管理问题。

于 2010-04-26T14:48:45.390 回答
1
struct D;
struct CommonABC
{
   CommonABC(D * & dpointer) : dpointer(dpointer) {}
   D * & dpointer;
};
struct C : CommonABC 
{
   C (const CommonABC & common) : CommonABC(сommon) {}
};
struct B: CommonABC 
{
   B (const CommonABC & common) : CommonABC(сommon), c(common) {}
   C c;
};
struct A 
{
   A () : b(CommonABC(dpointer)) {}
   D * dpointer;
   B b;
};
于 2010-04-26T14:59:57.953 回答
1

在这种情况下,您可能应该传递对BandC而不是指针的引用。正如@Billy ONeil 在他的回答中所说,您应该在可能且适当的情况下使用 ashared_ptr或 a scoped_ptr(在不了解Dand的情况下无法判断dpointer) in A。传递对Band的引用C具有明确这两个仅使用D-object 的优点,但不控制它的生命周期,并且需要一个实例D才能使用这些类(使用指针NULL将是一个选项)。如果BC仅在 上调用const方法D,您甚至可以传递 const 引用。

于 2010-04-26T15:09:50.777 回答
1

在实践中,我可能会选择上面提到的 shared_ptr 解决方案。但这里有另一种在 C++ 文献中不常涉及的方法,您可能会在面试问题或 BrainBench 测试中找到这种方法:

struct D{
  D(int val);
  void foo();
};
struct C:private virtual D{
  void bar(){
    foo();
  } 
};
struct B:private C,private virtual D{
  void car(){
    foo();
  }
};

struct A:private B,private virtual D{   
   A(int val):D(val){}
   void aar(){
    car();
    foo();
   }

};

私有继承实现了has-a关系,就像使其成为成员一样。唯一的区别是您只能拥有每种类型中的一种。在这种情况下,相同的 D 对象由组合中的所有类共享。

但是,如果您希望其他人能够理解您在做什么,请使用 shared_ptrs。

于 2010-04-26T16:00:32.643 回答