C++ C++;-std::向量中的唯一ptr<&燃气轮机;是nullptr吗

C++ C++;-std::向量中的唯一ptr<&燃气轮机;是nullptr吗,c++,polymorphism,unique-ptr,C++,Polymorphism,Unique Ptr,我想将粒子对象存储在向量对象中,以便以后可以访问它。 这些粒子(电子和质子)继承自粒子类,该类包含一个toString()虚拟方法。然后在Electron和Proton类中重写此toString()方法 读取向量容器时,我希望访问特定于电子或质子的toString()方法,而不是粒子 显然,一种方法是使用std::unique\u ptr。以下是我尝试运行的代码部分: intmain(){ /**/ 标准::矢量粒子(NB粒子); 粒子。推回(std::unique_ptr(新电子(1.0,2.

我想将
粒子
对象存储在
向量
对象中,以便以后可以访问它。 这些粒子(
电子
质子
)继承自
粒子
类,该类包含一个
toString()
虚拟方法。然后在
Electron
Proton
类中重写此
toString()
方法

读取向量容器时,我希望访问特定于
电子
质子
toString()
方法,而不是
粒子

显然,一种方法是使用
std::unique\u ptr
。以下是我尝试运行的代码部分:

intmain(){
/**/
标准::矢量粒子(NB粒子);
粒子。推回(std::unique_ptr(新电子(1.0,2.0,3.0));
粒子。推回(std::unique_ptr(新质子(1.0,2.0,3.0));
粒子。推回(std::unique_ptr(新粒子(0.0,0.0,1.0,2.0,3.0));
if(粒子[0]==nullptr){

STD::P>你犯了一个经典错误,即使是最有经验的C++程序员也会出错:你用初始大小声明了向量,然后用代码> PoSubBuff</代码> ED附加元素,而不是赋值给现有元素。
来自向量初始化。

可能需要添加,如果知道有多少元素,他们应该添加一个reserve调用。这样他们就不必通过多次重新分配进行g。谢谢,它现在可以工作:)但是为什么
粒子
对象上的指针是非
空ptr
而继承类型上的指针是w在这里,
nullptr
?@t0t0仅仅是一个猜测,您是否将
nbParticles
设置为1或2?准确地说,是int-nbElectrons{1};int-nbProtons{1};std::vector particles(nbElectrons+nbProtons)所以yes@zett42当您知道代码大小时,使用
reserve
绝对不是过早优化。过早优化会损害代码的可读性/可维护性,或增加代码的复杂性,从而使代码运行更快,而无需测量它的需要。
particles.reserve(3);
提高了代码的可读性/可维护性-它清楚地传达了“我事先知道这个向量的大小”。没有它,代码传达了向量大小的不确定性。您的代码具有未定义的行为,因为
粒子
没有
虚拟
析构函数。