C ++-vector <>中的std :: unique_ptr为nullptr

时间:2018-08-31 15:46:37

标签: c++ polymorphism unique-ptr

我想将Particle对象存储在vector对象中,因此以后可以访问它。 这些粒子(ElectronsProtons)是从Particle类继承的,该类包含一个toString()虚拟方法。然后,在toString()Electron类中覆盖此Proton方法。

当我读取向量容器时,我想访问特定于toString()Electron的{​​{1}}方法,而不是Proton

显然,一种方法是使用Particle。这是我尝试运行的部分代码:

std::unique_ptr

指向int main(){ /**/ std::vector<std::unique_ptr<Particle>> particles(nbParticles); particles.push_back(std::unique_ptr<Electron>( new Electron(1.0, 2.0, 3.0))); particles.push_back(std::unique_ptr<Proton>(new Proton(1.0, 2.0, 3.0))); particles.push_back(std::unique_ptr<Particle>(new Particle(0.0, 0.0, 1.0, 2.0, 3.0))); if (particles[0]==nullptr){ std::cout<< "index=0 : nullptr"<<std::endl; //There is a null_ptr at particles[0] } if (particles[2]==nullptr){ std::cout<< "index=2 : nullptr"<<std::endl; //There is not a null_ptr at particles[2] } std::cout<<particles[0]->toString()<<std::endl; //This is what I'm trying to do /**/ } 对象的指针似乎很好,但指向ParticleElectron的指针似乎没有问题。我猜构造函数有问题吗?

Proton

及其定义:

class Particle
{
public:
    Particle();
    Particle(double mass, double charge, double posX, double posY, double posZ);
    virtual std::string toString() const;
}

class Electron : public Particle
{
public:
    Electron(double PosX, double PosY, double PosZ);
    virtual std::string toString() const;
}

class Proton : public Particle
{
public:
    Proton(double PosX, double PosY, double PosZ);
    virtual std::string toString() const;
}

1 个答案:

答案 0 :(得分:19)

您犯了一个经典错误,即使是最有经验的C ++程序员也会犯错:您以初始大小声明了向量,然后push_back为其添加了其他元素,而不是分配给现有元素。通过从向量初始化中删除(nbParticles)来解决此问题。