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

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

本文关键字:创建 复制 构造函数 变量 成员 引用 C++      更新时间:2023-10-16

我有一个类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在 dereived 类ModelRecorder.

错误:"const 类 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_;
}

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