2013-10-02 39 views
0

我有一组类:Value,ReportItem,ReportMessage。值类是抽象的与多个不同的具体实施方式(例如INTVALUE,的floatValue,的doubleValue等)的具体的类被添加到当它被传递一个参考值产生的ReportItem的:您能否从抽象参考创建具体对象的副本

ReportItem(Value& value); 

然后ReportItems添加使用“的addItem”方法的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。

+2

只是让'ReportItem'自己的价值,并通过基类指针处理它。 –

+1

将它作为一个指针可以处理[clone pattern](http://en.wikipedia.org/wiki/Prototype_pattern)的复制。 – BartoszKP

回答

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));

+0

这对我不起作用,因为我必须处理值派生类,而不是原始类型。我认为克隆模式可能是我必须使用的。 – DaveR

+1

该类可以修改为采用模板构造函数。 – jxh

+0

如果你没有C++。11,你可以使用Boost的'shared_ptr <>'代替。它将提供适当的析构函数,复制和分配语义,但它确实增加了引用计数操作的成本。 – jxh