0

我有一门课,我们称之为多项式。

所需多项式的数量事先不知道,并在运行时确定。我目前的实现使用了一个容器类,我们称之为Solutions,其中有一个向量,我们称之为polynomialVector,它是这样定义的:

 std::vector<Polynomial> polynomialVector;

向量以这种方式创建和填充(解决方案的构造函数执行此工作):

polynomialVector.reserve(numberofneededpolynomials);
for(int i = 0; i < numberofneededpolynomials ; i++) {
 polynomialVector.emplace_back(0) //Polynomial constructor takes an int parameter
}

现在我想创建从通用多项式类继承的特定类型的多项式。多项式的类型将由用户在运行时确定。例如,如果用户输入 0,则使用通用多项式类,如果他输入 1,则使用特定派生多项式类,对于类型 2,使用不同特定类型的多项式等。

我在示例中看到这可以使用常规数组来完成:

Polynomial * polynomial1 = new DerivedPolynomial1(parameters);
Polynomial * polynomial2 = new DerivedPolynomial2(parameters);
Polynomial * arrayPolynomial[2] = {polynomial1, polynomial2};

但是我需要使用向量来完成它,因为应用程序创建了许多事先不知道的不同多项式(由多项式类随机创建,但这不相关)。我包装多项式类(解决方案类)的整个代码已经为向量编码。

我需要做这样的事情:

cin >> type;
if(type == 0) {
 polynomialVector.reserve(numberofneededpolynomials);
 for(int i = 0; i < numberofneededpolynomials ; i++) {
  *create polynomial of type 0 in a similar way that emplace_back does for the general case that I described*
 }
if(type == 1) {
  ... same thing but for type 1
}

这个怎么做?

4

2 回答 2

4

要将多态数据类型存储在 std::vector 中,您需要存储指针。

为了确保代码不会泄漏内存,最简单的方法是使用智能指针。

std::vector<std::unique_ptr<Polynomial>> polynomialVector;
polynomialVector.emplace_back(new DerivedPolynomial1(parameters));

我假设您使用 C++11,因为您的代码使用emplace_back

于 2013-04-15T18:25:18.963 回答
0

您应该将它们存储为指针,如下所示:

std::vector<Polynomial *> polynomialVector;
                       ^

此外,您必须处理内存(新建/删除)并将派生对象作为指向向量的指针。

随意使用std::unique_ptrstd::shared_ptr代替简单的指针:

std::vector<std::unique_ptr<Polynomial>> polynomialVector;

或者

std::vector<std::shared_ptr<Polynomial>> polynomialVector;
于 2013-04-15T18:24:35.180 回答