包含指针的向量

Posted

技术标签:

【中文标题】包含指针的向量【英文标题】:A vector containing pointers 【发布时间】:2015-10-05 10:59:30 【问题描述】:

解决方案我必须写#include "polynomial.h",此外,我必须传递P作为对addPolynomial的引用。

我有一个名为Function 的类,其成员变量为vector<functionSegment*> functionParts

functionSegment 有两个派生类,分别是PolynomialExponential

EDIT函数addPolynomial是一个声明为void Function::addPolynomial(Polynomial* P, ifstream& input)的函数

main,我有以下内容:

Polynomial* P; //I made a constructor that takes no arguments  
mainFunction.addPolynomial(P, input); //All that changes is the thing P is pointing to: NOTHING ELSE is changed  
(mainFunction.functionParts).push_back(P); //This gives problems  

EDIT 重新检查addPolynomial 函数后,我意识到第二条评论并不完全正确:P 确实是new-ed。因此,我应该在main 中写入Polynomial* P = new Polynomial 并使用复制构造函数,或者通过引用传递P。我选择了后者。

错误是:

no matching function for call to 'std::vector<functionSegment*>::push_back(Polynomial*&)'
candidates are:
void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = functionSegment*; _Alloc = std::allocator<functionSegment*>; std::vector<_Tp, _Alloc>::value_type = functionSegment*]|
no known conversion from argument 1 from 'Polynomial*' to 'functionSegment* const&'

显然,push_back 想要functionSegment* const&amp;,但它收到了Polynomial*。因为Polynomial 是类型 functionSegment,问题是我们需要一个const*&amp; Polynomial。这是有道理的,因为它更有效。但是接下来我该怎么办? P 是一个指向 Polynomial 对象的指针,所以我们需要一个指针的引用。

(mainFunction.functionParts).push_back(&amp;P) 不起作用。

【问题讨论】:

Polynomial* P;不会调用您的无参数构造函数。 SSCCE 请。 在您的addPolynomial 中,您是新来的吗?如果没有拼图的所有部分,您的代码有点难以理解。 functionSegment继承Polynomial时忘记public了吗? @Bathsheba,你是完全正确的。它确实没有调用任何构造函数。 @Cyber​​Spock,是的,我在那里做new。我意识到我应该将指针作为参考传递。 @nwp,我没有忘记这样做。 【参考方案1】:

首先Polynomial* P; 必须是Polynomial* P = new Polynomial;,除非addPolynomial 将P 作为Polynomial *&amp; 并分配newed Polynomial

现在回答问题。您要么忘记公开从 functionSegment 继承,要么忘记包含标头,并已转发声明类型。

【讨论】:

有可能是addPolynomial 创建了Polynomial 所指向的P,因此第一句话可能不正确。即使是这样,我也会反对Polynomial P = new Polynomial;,而是写Polynomial P; @nwp,addPolynomial 方法可能会创建它,但评论让我怀疑,因为他有一个指针向量,如果他是,他需要在堆上添加一些东西添加多个。我将对第一个声明进行澄清。 @Dominic McDonnel,我确实应该通过参考。其次,我确实没有忘记从functionSegment公开继承,但我确实向前声明了类型(我在main中有#include "function.h",这个文件有前向声明),并且在写#include "polynomial.h"之后我不再有错误!你能告诉我为什么这可以解决问题吗?我不写Polynomial* P = new Polynomial,所以main不需要知道Polynomial的结构,但是为什么push_back只有在包含header时才接受我的Polynomial @SebastiaanDraijer,没有定义编译器不知道Polynomial 继承自functionSegment。所以它看起来像完全不相关的类型,它不知道如何转换。包含标头后,编译器会看到该指针可直接转换为 functionSegment 指针。

以上是关于包含指针的向量的主要内容,如果未能解决你的问题,请参考以下文章

如何重建包含向量的非指针类成员?

如何访问包含指向字符串的指针的向量的元素?

C++,成员函数返回对包含指向 const 对象的指针的向量的 const 引用

std::sort 对包含 Objects* 指针的 Objects 向量进行排序

用于对包含指向自定义类对象的指针的向量进行排序的比较器

根据包含的类型检索向量的向量