0

我有以下函数和类层次结构,这样 Multinumber 由 Pairs、Rational 和 Complex 继承。所有这些共享功能在 Multinumber 中都是虚拟的。我的问题是以下代码。按照现在的编写方式,newElement 变量在添加到 my setArraywhich 的 type时超出范围Multinumber**,我需要想办法在这个函数中分配内存。奇怪的是,传递给函数的参数,即使打印在第一行,当我执行时总是空的cout<<newElement->tostring();谁能告诉我这里有什么问题?

bool Set::addElement(Multinumber* newElement)
{
    bool success = false;
    if(isFull())
    {
        resize();
    }
    if(!isMember(newElement))
    {
        setArray[numElements] = newElement;
        numElements++;
        success = true;
    }
    return success;
}

编辑:是的,海报是正确的,这是家庭作业

4

3 回答 3

1

为避免内存问题,请替换Multinumber** setArraystd::vector<boost::shared_ptr<Multinumber>> setArray.

于 2010-12-04T20:28:11.710 回答
0

如果您需要它增长,请将其设为类型vector<Multinumber*>并使用 setArray.push_back(newElement)。

您需要确保只要向量还活着,调用者就会使元素保持活动状态。如果没有,也许向 Multinumber 添加一个虚拟 Clone 方法,该方法返回一个副本(并且子类实现它)。那么,push_back(newElement->Clone())

于 2010-12-04T20:30:05.523 回答
0

在现实世界中(我从您之前的问题中了解到这是用于家庭作业),您不会实现自己的设置。标准库提供此功能(std::set如果您想保持元素有序;std::unordered_set如果您使用 C++0x 和/或具有适当的扩展,并将速度优先于附加功能)。

您可能还应该研究一些智能指针类。

那说:

在您的代码中,newElement不会超出范围。发生的情况是,您已经获得了指向调用代码数据的指针,然后调用代码让指向的东西超出范围。

正如我回答您之前的问题一样,您需要使用“虚拟克隆成语”来制作副本。

基本上,你想new用传入的、指向的东西的任何类型进行调用,从而制作一个副本。为了确保“制作副本”,很自然的做法是将复制构造函数与 一起使用new,即new whatever(my_existing_whatever_instance). 但是在 C++ 中,构造函数不能是virtual,因此我们实际上不能将所需的类型放入new调用中。相反,我们必须使用成员函数来伪造它。由于成员函数can be ,因此在实际指向的事物中查找virtual正确的版本,该事物被实现为使用自己的类型调用,并调用自己的复制构造函数。该链接提供了详细信息。clonenew

于 2010-12-04T20:32:39.747 回答