我有一节课,我们称之为多项式。
预先知道所需多项式的数量,并在运行时确定。我当前的实现使用了一个容器类,我们称之为解决方案,其中有一个向量,我们称之为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};
但是我需要使用向量来实现它,因为应用程序会创建许多不同的多项式(由多项式类随机创建,但这不相关),这是事先不知道的。我包含Polynomial类(Solutions类)的整个代码已经编码为vector。
我需要做这样的事情:
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
}
怎么做?
答案 0 :(得分:4)
要在std :: vector中存储多态数据类型,您需要存储指针。
为了确保代码不会泄漏内存,最简单的方法是使用智能指针。
std::vector<std::unique_ptr<Polynomial>> polynomialVector;
polynomialVector.emplace_back(new DerivedPolynomial1(parameters));
我假设您使用C ++ 11,因为您的代码使用emplace_back
答案 1 :(得分:0)
你应该将它们存储为指针,如下所示:
std::vector<Polynomial *> polynomialVector;
^
此外,您必须处理内存(new / delete)并将派生对象作为指向vector的指针。
随意使用std::unique_ptr
或std::shared_ptr
代替简单指针:
std::vector<std::unique_ptr<Polynomial>> polynomialVector;
或
std::vector<std::shared_ptr<Polynomial>> polynomialVector;