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

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

提问人:pelican brady 提问时间:8/23/2018 最后编辑:pelican brady 更新时间:8/23/2018 访问量:7334

问:

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

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

    OpModel& modelRef_;
};

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

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

请注意,这是一个抽象基类。CompositionalModel

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

例如CompositionalModel& recordedModel();

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

我试过了这个,但它给出了错误,这是正确的,在dereived类中。modelRefModelRecorder

错误:“const 类 mv::CompositionalModel”没有名为“modelRef_

mv::ModelRecorder::ModelRecorder(const CompositionalModel& arg) : CompositionalModel{static_cast<const ModelRecorder&>(arg)}, modelRef_{arg.modelRef_}
{
}
C++ 引用 copy-constructor

评论

4赞 YSC 8/23/2018
这就是引用的默认复制构造函数。无事可做。除非您所说的引用成员 modelRef 的含义有些可疑,否则将使用之前创建的 OpModel object_进行初始化。请提供最小的可重复示例
2赞 Fureeish 8/23/2018
ModelRecorder(const ModelRecorder&) = default会做到的

答:

9赞 Fureeish 8/23/2018 #1

有 2 种方法:

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

ModelRecorder(const ModelRecorder&) = default;

第二种方式 - 自己实现:

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

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

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

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

评论

1赞 lubgr 8/23/2018
第二个和第三个版本不调用基类复制构造函数,你要添加这个。请参阅有效 C++ 第 3 版中的第 12 项(“复制对象的所有部分”)。
0赞 Fureeish 8/23/2018
我的坏,忽略了继承的事实。谢谢你指出这一点,先生。ModelRecorderCompositionalModel
0赞 lubgr 8/23/2018
不客气,向用户扔斯科特·迈耶斯(Scott Meyers)的物品总是有益和有趣的:P
0赞 pelican brady 8/23/2018
@Fureeish 谢谢 - 如果您想将对基类的引用传递给复制构造函数怎么办?程序的另一部分返回对 的引用。我知道返回对较窄基类的引用是很好的 OOP。CompositionalModelCompositionalModel
0赞 Max Langhof 8/23/2018
@pelicanbrady 那么它就不再是复制构造函数了。无论如何,一个最小的可重复的例子来说明你的情况,真的有助于提供好的答案。