我有四个课程A
,B
,C
和D
。
A
有一个班级成员b
B
。B
的成员c
属于C
。 A
有一名成员D* dpointer;
必须保留此层次结构(事实上,这是一个带有应用,窗口,面板为A
,B
和C
)的GUI。
现在B和C必须使用*dpointer
中的方法。
作为dpointer
和B
的成员提供C
是否更优雅?这不好吗?
答案 0 :(得分:2)
不是直接的,但你可以将D放在shared_ptr<D>
内,这可以减轻你可能遇到的任何内存管理问题。
答案 1 :(得分: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;
};
答案 2 :(得分:1)
在这种情况下,您应该传递对B
和C
的引用,而不是指针。正如@Billy ONeil在his answer中所说,如果可能且适当,您应该使用shared_ptr
或scoped_ptr
(如果不了解D
和dpointer
,则无法判断)A
。
传递对B
和C
的引用有利于明确这两个仅仅使用
D
- 对象,但不控制它的生命周期,并且需要D
的实例来使用这些类(使用指针NULL
是一个选项)。如果B
和C
仅在const
上调用D
方法,您甚至可以传递const引用。
答案 3 :(得分: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。