C++ 使用引用成员变量为 class 创建复制构造函数
C++ creating a copy constructor for a class with a reference member variable
我有一个 class ModelRecorder
包含对另一个 class OpModel 的引用 modelRef_
。
class ModelRecorder : public CompositionalModel //This is an abstract base class
{
OpModel& modelRef_;
};
创建 ModelRecorder
的实例并初始化 modelRef_
时。没关系,我不明白。
我如何为 ModelRecorder
编写复制构造函数,以便在创建另一个实例时,引用成员 modelRef_
将使用之前创建的 OpModel 对象进行初始化?
注意 CompositionalModel
是一个抽象基础 class。
在另一个 class 中有一个函数 returns 引用 CompositionalModel
他的基础 class。我知道返回较窄的基数 class 是一个很好的 OOP。
例如CompositionalModel& recordedModel();
我想将这个对基 class 的引用传递给复制构造函数。
我试过了,但它给出了错误,这是正确的 modelRef
是在派生的 class ModelRecorder
.
错误:‘const class 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_;
}
就是后面的没有初始化引用。它违反了规则,因为必须初始化引用,而不是稍后分配。我最好的建议是坚持使用简单的方法,因为使用它最不可能搞砸
我有一个 class ModelRecorder
包含对另一个 class OpModel 的引用 modelRef_
。
class ModelRecorder : public CompositionalModel //This is an abstract base class
{
OpModel& modelRef_;
};
创建 ModelRecorder
的实例并初始化 modelRef_
时。没关系,我不明白。
我如何为 ModelRecorder
编写复制构造函数,以便在创建另一个实例时,引用成员 modelRef_
将使用之前创建的 OpModel 对象进行初始化?
注意 CompositionalModel
是一个抽象基础 class。
在另一个 class 中有一个函数 returns 引用 CompositionalModel
他的基础 class。我知道返回较窄的基数 class 是一个很好的 OOP。
例如CompositionalModel& recordedModel();
我想将这个对基 class 的引用传递给复制构造函数。
我试过了,但它给出了错误,这是正确的 modelRef
是在派生的 class ModelRecorder
.
错误:‘const class 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_;
}
就是后面的没有初始化引用。它违反了规则,因为必须初始化引用,而不是稍后分配。我最好的建议是坚持使用简单的方法,因为使用它最不可能搞砸