包含指针的向量
Posted
技术标签:
【中文标题】包含指针的向量【英文标题】:A vector containing pointers 【发布时间】:2015-10-05 10:59:30 【问题描述】:解决方案我必须写#include "polynomial.h"
,此外,我必须传递P
作为对addPolynomial
的引用。
我有一个名为Function
的类,其成员变量为vector<functionSegment*> functionParts
。
functionSegment
有两个派生类,分别是Polynomial
和Exponential
。
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&
,但它收到了Polynomial*
。因为Polynomial
是类型
functionSegment
,问题是我们需要一个const*& Polynomial
。这是有道理的,因为它更有效。但是接下来我该怎么办?
P
是一个指向 Polynomial 对象的指针,所以我们需要一个指针的引用。
(mainFunction.functionParts).push_back(&P)
不起作用。
【问题讨论】:
Polynomial* P;
将不会调用您的无参数构造函数。
SSCCE 请。
在您的addPolynomial
中,您是新来的吗?如果没有拼图的所有部分,您的代码有点难以理解。
从functionSegment
继承Polynomial
时忘记public
了吗?
@Bathsheba,你是完全正确的。它确实没有调用任何构造函数。 @CyberSpock,是的,我在那里做new
。我意识到我应该将指针作为参考传递。 @nwp,我没有忘记这样做。
【参考方案1】:
首先Polynomial* P;
必须是Polynomial* P = new Polynomial;
,除非addPolynomial
将P 作为Polynomial *&
并分配new
ed 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 引用