我有四个班级A
,B
和。C
D
- 类
A
有一个b
类 的成员B
。 - 类
B
有一个c
类的成员C
。
A
有会员D* dpointer;
必须保留此层次结构(实际上,这是一个带有应用程序、窗口、面板A
和B
的GUI C
)。
现在 B 和 C 必须使用来自 的方法*dpointer
。
作为anddpointer
的成员,还有什么比给予更优雅的吗?不好吗?B
C
不是直接的,但是您可以将 D 放在 ashared_ptr<D>
中,这将减轻您可能遇到的任何内存管理问题。
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;
};
在这种情况下,您可能应该传递对B
andC
而不是指针的引用。正如@Billy ONeil 在他的回答中所说,您应该在可能且适当的情况下使用 ashared_ptr
或 a scoped_ptr
(在不了解D
and的情况下无法判断dpointer
) in A
。传递对B
and的引用C
具有明确这两个仅使用D
-object 的优点,但不控制它的生命周期,并且需要一个实例D
才能使用这些类(使用指针NULL
将是一个选项)。如果B
且C
仅在 上调用const
方法D
,您甚至可以传递 const 引用。
在实践中,我可能会选择上面提到的 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。