首页 > 解决方案 > C ++为具有引用成员变量的类创建复制构造函数

问题描述

我有一个包含对另一个类 OpModelModelRecorder的引用的类。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_}
{
}

标签: c++referencecopy-constructor

解决方案


有2种方式:

第一种方法 - 让编译器为你做这件事:

ModelRecorder(const ModelRecorder&) = default;

第二种方式 - 自己实现:

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

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

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

就是后者没有初始化引用。它违反了规则,因为必须初始化引用,而不是稍后分配。我最好的建议是坚持使用简单的方法,因为使用它最不可能搞砸


推荐阅读