gpt4 book ai didi

c++ - 你能从抽象引用中创建一个具体对象的拷贝吗

转载 作者:行者123 更新时间:2023-11-28 07:23:07 25 4
gpt4 key购买 nike

我有一组类:Value、ReportItem、ReportMessage。 Value 类是抽象的,具有许多不同的具体实现(例如 IntValue、FloatValue、DoubleValue 等)。在创建 ReportItem 时,通过传递对值的引用将具体类添加到 ReportItem 中:

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 对象并保留该引用,直到 ReportItem 被删除。这是个问题,因为如果在 ReportItem 完成之前删除 Value 对象,地球将脱离其轴并螺旋进入太阳。

有什么好的方法可以解决这个问题吗?我想要的是一种引用值对象 (Value&) 并以某种方式创建具体对象拷贝的方法,该拷贝随后将由报告项保留。这可能吗,或者是否有更好的方法。

谢谢。

注意:我没有使用 C++11。

最佳答案

作为一个简化示例,您可以通过以下方式制作 ReportItem类(class)拥有值(value)。您需要努力研究复制和赋值语义(“虚拟复制构造函数”等),但我将其留给您解决(即在此站点上搜索现有答案):

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++ - 你能从抽象引用中创建一个具体对象的拷贝吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19147373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com