C++ 使用引用成员变量为 class 创建复制构造函数

C++ creating a copy constructor for a class with a reference member variable

我有一个 class ModelRecorder 包含对另一个 class OpModel 的引用 modelRef_

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

    OpModel& modelRef_;
};

创建 ModelRecorder 的实例并初始化 modelRef_ 时。没关系,我不明白。

我如何为 ModelRecorder 编写复制构造函数,以便在创建另一个实例时,引用成员 modelRef_ 将使用之前创建的 OpModel 对象进行初始化?

注意 CompositionalModel 是一个抽象基础 class。

在另一个 class 中有一个函数 returns 引用 CompositionalModel 他的基础 class。我知道返回较窄的基数 class 是一个很好的 OOP。

例如CompositionalModel& recordedModel();

我想将这个对基 class 的引用传递给复制构造函数。

我试过了,但它给出了错误,这是正确的 modelRef 是在派生的 class ModelRecorder.

错误:‘const class mv::CompositionalModel’没有名为‘modelRef_

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

有两种方法:

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

ModelRecorder(const ModelRecorder&) = default;

第二种方式-自己实现:

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

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

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

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