【发布时间】:2014-04-06 13:35:27
【问题描述】:
我的问题是基于典型的菱形层次结构,但不是典型的菱形问题。
class Interface
{
public:
int value;
// SomeBigData &data;
Interface(int _value = 0) : value(_value) {};
virtual void function1() = 0;
virtual void function2() = 0;
};
class ImpOne : public virtual Interface
{
public:
void function1() { ++value; }
};
class ImpTwo : public virtual Interface
{
public:
void function2() { --value; }
};
class Device : public ImpOne, public ImpTwo
{
public:
Device() : Interface(7) {};
};
有一个抽象接口定义了许多功能(上面的例子是简化的)。然后有一些实现类一次只实现其中的几个功能。最后,还有一个非抽象类,如上面的 Device 类,通过将几个实现类组合在一起来实现整个接口。
现在,问题是这样的:
Interface 类中有一个整数元素,它由 Device 类初始化并在实现类之间共享,到目前为止一切都很好。但是如果我从Interface(int _value = 0) 构造函数中删除= 0,整个系统就会崩溃,因为我缺少接口类的默认构造函数,这有点奇怪,因为它永远不会被调用。
为什么这会困扰我?正如代码中所建议的,接口类需要包含对复杂数据结构(不属于该类)的引用,而不是在所有派生实现类之间共享。然而,为引用指定默认值既不明智也不可能。
所以问题是:
如何正确初始化接口类(引用)元素,例如代码中建议的SomeBigData &data,我无法为默认构造函数指定默认值(无论如何都不会调用)?还是我做错了什么?
【问题讨论】:
-
“整个系统崩溃”是什么意思?
-
接口的概念(不是 c++ 概念)需要一个抽象类,它不包含(!)数据,而只包含虚函数。
-
如果
Interface类应该提供接口,为什么它有一个属性value,不适合实现类的属性吗? -
您可以选择在默认构造函数中保持引用未初始化。这确实是一个奇怪的设计,但它会让编译器闭嘴。
-
如果构造函数未初始化引用,则会导致错误。
标签: c++ inheritance virtual-inheritance diamond-problem