0

我有一组类:Value、ReportItem、ReportMessage。Value 类是抽象的,具有许多不同的具体实现(例如 IntValue、FloatValue、DoubleValue 等)。具体类在通过传递对值的引用创建 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。

4

1 回答 1

1

作为一个简化的示例,以下是如何让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));.)

于 2013-10-02T21:51:20.950 回答