我有以下函数和类的层次结构,因此多数是由Pairs,Rational和Complex继承的。所有这些共享函数在Multinumber中是虚拟的。我的问题是以下代码。现在它的编写方式,newElement变量在添加到类型为setArray
的{{1}}时超出范围,我需要找出在此函数中分配内存的方法。奇怪的是,传入函数的参数,即使打印在第一行,在我执行Multinumber**
时总是空的。有人可以告诉我这里有什么问题吗?
cout<<newElement->tostring();
编辑:是的,海报是正确的,这是一项家庭作业
答案 0 :(得分:1)
为避免内存问题,请将Multinumber** setArray
替换为std::vector<boost::shared_ptr<Multinumber>> setArray
。
答案 1 :(得分:0)
如果您需要增长,请将其设为vector<Multinumber*>
类型并使用setArray.push_back(newElement)。
只要向量处于活动状态,您就需要确保调用者使元素保持活动状态。如果没有,可能会向Multinumber添加一个虚拟Clone方法,返回一个副本(子类实现它)。然后,push_back(newElement->Clone())
。
答案 2 :(得分:0)
在现实世界中(我从your previous question了解到这是作业),你不会实现自己的集合。标准库提供此功能(std::set
如果要保持元素顺序; std::unordered_set
如果您正在使用C ++ 0x和/或具有适当的扩展,并优先考虑速度超过附加功能)。
您可能还应该研究一些智能指针类。
那说:
在您的代码中,newElement
不会超出范围。发生的事情是你已经获得了一个指向调用代码数据的指针,然后调用代码让指向的东西超出了范围。
As I responded对于上一个问题,您需要使用“virtual clone成语”来制作副本。
基本上,你想要以传入的,指向的东西的类型调用new
,以这种方式制作副本。为确保“制作副本”,自然要做的就是使用new
复制构造函数,即new whatever(my_existing_whatever_instance)
。但是在C ++中,构造函数不能是virtual
,因此我们实际上无法将所需的类型放入new
调用中。相反,我们必须使用成员函数伪造它。由于成员函数可以为virtual
,因此会在实际指向的内容中查找正确的版本clone
,该内容实现为使用自己的new
调用{{1}}键入,并调用自己的复制构造函数。该链接提供了详细信息。