pel*_*ady 6 c++ reference copy-constructor
我有一个ModelRecorder包含modelRef_对另一个类 OpModel的引用的类。
class ModelRecorder : public CompositionalModel //This is an abstract base class
{
OpModel& modelRef_;
};
Run Code Online (Sandbox Code Playgroud)
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_}
{
}
Run Code Online (Sandbox Code Playgroud)
有2种方式:
第一种方法 - 让编译器为你做:
ModelRecorder(const ModelRecorder&) = default;
Run Code Online (Sandbox Code Playgroud)
第二种方式 - 自己实现:
ModelRecorder(const ModelRecorder& arg)
:CompositionalModel{arg}, modelRef_{arg.modelRef_} {}
Run Code Online (Sandbox Code Playgroud)
请注意,您必须使用成员初始值设定项列表,因为我们正在处理引用。上面代码和这个的区别:
ModelRecorder(const ModelRecorder& arg)
:CompositionalModel{arg} {
modelRef_ = arg.modelRef_;
}
Run Code Online (Sandbox Code Playgroud)
是后者不初始化引用。它违反了规则,因为必须初始化引用,而不是稍后分配。我最好的建议是坚持使用简单的方法,因为使用它是最不可能搞砸的