是否可以通过初始化列表初始化引用类型?

时间:2015-02-23 03:26:21

标签: c++ windows visual-studio-2013 initialization-list

首先,如果这是一个糟糕的问题,我道歉。我是C ++的新手。

我有一组包含引用类型字段的类头,它是一个接口(从纯虚函数构建的类)。我想初始化我的类,以便默认情况下引用类型字段设置为某个"具体"派生类,这是使用默认构造函数(无参数!)完成的。我还希望能够用另一个"具体的"来覆盖这个初始化。衍生类。

到目前为止,我的课程标题如下:

class Foo {

public:

Foo();

Foo(IBar & bar);

protected:

/* Update 1: const field */
const IBar & bar;

...
}

但我正在努力实施:

/* Is it possible to create the reference type through the initialisation list? */

/* Update 2: corrected initialisation of bar field from "BarDerivedA() bar" to "BarDerivedA()" */
Foo::Foo()
: bar(BarDerivedA())
{

}

/* Override */
Foo::Foo(IBar & bar)
: bar(bar)
{

}

更新 我们发现使用这种潜在的设计并不会有效。对于每个具有该字段的类,const IBar & bar的默认值几乎总是相同的对象,但单元测试除外 - 我们希望能够根据需要交换模拟类。

我不想在堆栈上不断创建相同的对象,因此可以在这些对象组的工厂中工作。

我按照以下方式走了一条构造函数的路线:

Foo::Foo(IBar & bar)
: bar(bar)
{

}

如果有人想提供关于将类引用字段设置为初始化列表中的临时对象的适当答案(即只能为const字段执行,并且将超出构造函数之外的范围),我将标记它作为公认的答案。或者将其标记为适当的副本。

1 个答案:

答案 0 :(得分:2)

您可以在类中添加默认对象,例如:

class Foo {
public:
    Foo() : bar(defaultBar);{}
    Foo(IBar& bar) : bar(bar) {}

protected:
    const BarDerivedA defaultBar; // Before the reference.
    const IBar& bar;
};