c++ - C ++为具有引用成员变量的类创建复制构造函数
问题描述
我有一个包含对另一个类 OpModelModelRecorder
的引用的类。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_}
{
}
解决方案
有2种方式:
第一种方法 - 让编译器为你做这件事:
ModelRecorder(const ModelRecorder&) = default;
第二种方式 - 自己实现:
ModelRecorder(const ModelRecorder& arg)
:CompositionalModel{arg}, modelRef_{arg.modelRef_} {}
请注意,您必须使用成员初始化器列表,因为我们正在处理引用。上面的代码和这个的区别:
ModelRecorder(const ModelRecorder& arg)
:CompositionalModel{arg} {
modelRef_ = arg.modelRef_;
}
就是后者没有初始化引用。它违反了规则,因为必须初始化引用,而不是稍后分配。我最好的建议是坚持使用简单的方法,因为使用它最不可能搞砸
推荐阅读
- database - 使用 Airflow DAG 将 Postgres 数据库备份到 Azure Blob 存储
- delphi - SAML SSO GOOGLE 能够在 delphi 客户端桌面应用程序 + mfa 中验证 gmail 帐户
- flutter - 如何通过颤动中的滚动属性将菜单项连接到容器,即html中的锚点
- mongodb - 带有嵌套对象数组的猫鼬查找查询
- sql-server - 如何连接两个或多个子查询或子选择
- python - 无法导入 mysql.connector
- raspberry-pi - 是否可以使用 npm 包上限嗅探您自己的 wifi 子网中的所有数据包?
- python - 如何使用某些按钮放大和缩小已经绘制的线条?
- apache-flink - Flink BroadcastProcessFunction vs CoProcessFunction
- c# - 有没有办法在 Azure.Storage.Blobs 中获取 blob 的 ContentType?