您能否从抽象引用创建具体对象的副本
Can you create a copy of a concrete object from an abstract reference
我有一组类:Value,ReportItem,ReportMessage。 Value 类是抽象的,具有许多不同的具体实现(例如 IntValue、FloatValue、DoubleValue 等(。 创建报表项时,通过传递对值的引用,将具体类添加到报表项中:
ReportItem(Value& value);
然后使用"addItem"方法向ReportItems添加一个ReportMessage,该方法获取报告项的副本并将其删除:
class ReportMessage {
...
void addItem(ReportItem item);
}
因此,代码片段可能如下所示:
IntValue value(1);
ReportItem item(value);
ReportMessage message;
message.addItem(item);
我在创建 ReportItem 的副本时没有问题,但我对值有问题,因为它是一个抽象类。 创建报表项时,它将采用对 Value 对象的引用,并保留该引用,直到删除报表项。这是个问题,因为如果在 ReportItem 完成之前删除 Value 对象,地球将脱离其轴并螺旋进入太阳。
有没有解决这个问题的好方法?我想要的是一种引用 Value 对象 (Value&( 并以某种方式创建具体对象的副本的方法,然后由报表项保留该副本。 这可能吗,或者有更好的方法。
谢谢。
注意:我没有使用 C++11。
作为一个简化的示例,下面介绍如何使ReportItem
类拥有该值。您需要在复制和赋值语义("虚拟复制构造函数"等(上努力工作,但我将其留给您解决(即在此站点上搜索现有答案(:
class ReportItem
{
Value * vptr; // vptr is the first thing in the class
public:
ReportItem(int n) : vptr(new IntValue(n)) { }
ReportItem(float x) : vptr(new FloatValue(x)) { }
~ReportItem() { delete vptr; }
// write difficult copy and assignment logic!
};
没有 C++11 会使这比它需要的更麻烦,因为您没有合理的移动语义,并且可能需要制作大量不必要的副本。
(在 C++11 中,你只有一个 std::unique_ptr<Value>
成员,没有显式析构函数,你可以说message.addItem(ReportItem(1.5));
。
相关文章:
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 如何从构造函数副本 T(const T&)调用对象 T?
- C ++引用函数参数似乎包含原始对象的副本,而不是充当"real reference"
- 将(临时的?)std::string传递给使用它来构造一个接受副本的对象的函数的最佳方法是什么?
- 将 Eigen::MatrixXd 转换为 arma::mat 并在新对象上制作副本
- C++ 在其自己的类中创建对象的修改副本
- 如何不删除基类对象的副本?
- 属于副本被推送到矢量的对象的指针会发生什么情况?
- 如何确保将对象通过许多层的组件时,不会制作副本
- C++ 如何创建链表的副本作为类对象
- 保留对象成员变量的本地副本
- 如何为同一类对象的成员函数保留单独的变量副本?
- 是 std::make_pair 在将对象添加到地图时创建副本
- 阻止用户创建班级对象的副本,但允许动态的对象有什么好处
- 替代STD ::向量存储参考而不是对象的副本
- 使用矢量push_back代码创建对象副本时遇到问题
- C++ 如何处理带有破坏状态的析构函数的对象副本
- 将对象副本添加到容器的更好方法
- 带有抽象类指针的c++对象副本
- 调用接收对象副本的函数后,原始函数将重置