提问人:pelican brady 提问时间:8/23/2018 最后编辑:pelican brady 更新时间:8/23/2018 访问量:7334
C++ 为具有引用成员变量的类创建复制构造函数
C++ creating a copy constructor for a class with a reference member variable
问:
我有一个类,其中包含对另一个类 OpModel 的引用。ModelRecorder
modelRef_
class ModelRecorder : public CompositionalModel //This is an abstract base class
{
OpModel& modelRef_;
};
创建并初始化 的实例时。没关系,我不明白。ModelRecorder
modelRef_
我将如何编写复制构造函数,以便在创建另一个实例时,引用成员将使用先前创建的 OpModel 对象进行初始化?ModelRecorder
modelRef_
请注意,这是一个抽象基类。CompositionalModel
在另一个类中,有一个函数返回对基类的引用。我知道返回较窄的基类是一个很好的 OOP。CompositionalModel
例如CompositionalModel& recordedModel();
我想将对基类的引用传递给复制构造函数。
我试过了这个,但它给出了错误,这是正确的,在dereived类中。modelRef
ModelRecorder
错误:“const 类 mv::CompositionalModel”没有名为“modelRef_
mv::ModelRecorder::ModelRecorder(const CompositionalModel& arg) : CompositionalModel{static_cast<const ModelRecorder&>(arg)}, modelRef_{arg.modelRef_}
{
}
答:
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
我的坏,忽略了继承的事实。谢谢你指出这一点,先生。ModelRecorder
CompositionalModel
0赞
lubgr
8/23/2018
不客气,向用户扔斯科特·迈耶斯(Scott Meyers)的物品总是有益和有趣的:P
0赞
pelican brady
8/23/2018
@Fureeish 谢谢 - 如果您想将对基类的引用传递给复制构造函数怎么办?程序的另一部分返回对 的引用。我知道返回对较窄基类的引用是很好的 OOP。CompositionalModel
CompositionalModel
0赞
Max Langhof
8/23/2018
@pelicanbrady 那么它就不再是复制构造函数了。无论如何,一个最小的可重复的例子来说明你的情况,真的有助于提供好的答案。
评论
ModelRecorder(const ModelRecorder&) = default
会做到的