C ++为具有引用成员变量的类创建复制构造函数

时间:2018-08-23 10:06:20

标签: c++ reference copy-constructor

我有一个类ModelRecorder,其中包含对另一个类OpModel的引用modelRef_

class ModelRecorder : public CompositionalModel //This is an abstract base class
{

    OpModel& modelRef_;
};

创建ModelRecorder的实例并初始化modelRef_时。没关系,那很好。

我将如何为ModelRecorder编写一个副本构造函数,以便如果创建另一个实例,则引用成员modelRef_将与先前创建的OpModel对象一起初始化?

请注意,CompositionalModel是抽象基类。

在另一个类中,有一个功能会返回对基类CompositionalModel的引用。我知道返回较窄的基类是一个很好的OOP。

例如CompositionalModel& recordedModel();

我想将此对基类的引用传递给复制构造函数。

我尝试了此操作,但它给出了错误,modelRef是正确的,它已被取消引用了类ModelRecorder

错误:“ const class mv :: CompositionalModel”没有名为“ modelRef _

”的成员
mv::ModelRecorder::ModelRecorder(const CompositionalModel& arg) : CompositionalModel{static_cast<const ModelRecorder&>(arg)}, modelRef_{arg.modelRef_}
{
}

1 个答案:

答案 0 :(得分:4)

有2种方法:

第一种方法-让编译器为您完成:

ModelRecorder(const ModelRecorder&) = default;

第二种方法-自己实施:

ModelRecorder(const ModelRecorder& arg)
    :CompositionalModel{arg}, modelRef_{arg.modelRef_} {}

请注意,由于我们正在处理引用,因此您必须使用成员初始化器列表。上面的代码和此代码之间的区别:

ModelRecorder(const ModelRecorder& arg) 
    :CompositionalModel{arg} {
    modelRef_ = arg.modelRef_;
}

是后来的不初始化引用。它违反了规则,因为引用必须初始化,以后再不分配。我最好的建议是坚持使用简单的方法,因为使用它的可能性极小