参考成员和未初始化的对象(设计相关)

时间:2012-10-09 19:20:52

标签: c++ interface reference

我有一个Playable类,它由两个不同的类继承:NoteTrack. Track类具有Generator类型的成员,该成员经常使用并且非常大。 Track还有一个Note-objects的多重映射。创建的每个音符始终会添加到正确的音轨中。

我的问题是,在某些情况下,Note类还需要访问Tracks Generator-member.

我想通过提供一个Track &trackReference成员来完成此操作,以便找到正确的GeneratortrackReference,但问题是我无法使用默认值构造函数因为引用不能为空。有时我的Note对象只是空的,所以我真的需要一个默认的构造函数Note。

那么我该如何实现它以便我可以从每个Note中访问Generator对象?

2 个答案:

答案 0 :(得分:1)

如果您的设计允许null实现,那么这是一条可能的路径。这是一个例子:

class foo
{
public:
   virtual void bar() = 0;
};

class null_foo
   : public foo
{
   virtual void bar() {}
};

class C
{
public:
   C(foo& f) : ref(f)  {}
   C() : ref(null_foo) {};

private:
   foo& ref;
};

这是related question.

答案 1 :(得分:0)

您可以简单地使用Track*代替Track&,它也有很多优势来实现您不能使用引用的函数。例如:

bool HasParent() {return trackReference != NULL;}
Track& track() {return *trackReference;}