繁体   English   中英

C ++使用引用成员变量为类创建副本构造函数

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

我有一个类ModelRecorder与包含参考modelRef_到另一个类OpModel。

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

    OpModel& modelRef_;
};

当一个实例ModelRecorder创建和modelRef_被initalized。 很好,我无法理解。

我将如何为ModelRecorder写一个副本构造函数,以便如果创建另一个实例,则引用成员modelRef_将与先前创建的OpModel对象一起初始化?

请注意, CompositionalModel是抽象的基类。

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

例如CompositionalModel& recordedModel();

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

我尝试了这个,但它给出了错误,这是正确的modelRef在取消引用的类ModelRecorder

错误:“常量类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_;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM