我有一个类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
是正确的,它已被取消引用了类ModelRecorder
。
错误:“ const class mv :: CompositionalModel”没有名为“ modelRef _
”的成员mv::ModelRecorder::ModelRecorder(const CompositionalModel& arg) : CompositionalModel{static_cast<const ModelRecorder&>(arg)}, modelRef_{arg.modelRef_}
{
}
答案 0 :(得分:4)
有2种方法:
第一种方法-让编译器为您完成:
ModelRecorder(const ModelRecorder&) = default;
第二种方法-自己实施:
ModelRecorder(const ModelRecorder& arg)
:CompositionalModel{arg}, modelRef_{arg.modelRef_} {}
请注意,由于我们正在处理引用,因此您必须使用成员初始化器列表。上面的代码和此代码之间的区别:
ModelRecorder(const ModelRecorder& arg)
:CompositionalModel{arg} {
modelRef_ = arg.modelRef_;
}
是后来的不初始化引用。它违反了规则,因为引用必须初始化,以后再不分配。我最好的建议是坚持使用简单的方法,因为使用它的可能性极小