C ++列表插入奇怪的行为

时间:2016-08-19 06:24:27

标签: c++ list class oop

我有一个名为Particle的类,另一个名为ParticleList,它本质上是一个粒子列表和一些其他函数。当我尝试将新粒子插入到ParticleList中时,我注意到一些奇怪的行为,我想知道为什么会发生这种情况。这些类定义为:

class Particle {
public:
    // Particle data members
    int index;
    vector<double> r_last;
    vector<double> r;
    vector<double> v;

    double m;
    double q;

    Particle(int i, double m, double q, int ndim) :
            index(i), m(m), q(q) {
        r_last.resize(ndim,0);
        r.resize(ndim,0);
        v.resize(ndim,0);};

    Particle() { };
    Particle(const Particle& p);
}

class ParticleList : public list<Particle> {
public:
    int highestIndex;
    size_t numParticles;
    ParticleList() {highestIndex = 0; numParticles=0;}


      /*below are functions that call the List<Particle>::push_back() 
      and List<Particle>::push_front() functions and increment numParticles*/

   void push_back(const Particle& p);
   void push_front(const Particle& p);

   //some more member functions here

};

push_back和push_front的定义:

void ParticleList::push_back(const Particle &p) {
    numParticles ++;
    list<Particle>::push_back(p);
}

void ParticleList::push_front(const Particle &p) {
    numParticles ++;
    list<Particle>::push_front(p);
}

当我尝试按如下方式插入粒子时出现问题:

    ParticleList newParticleList;
    Particle newParticle(1, 0.5, 0.5, 2); 
    /*creates a particle with index 1, mass and charge 0.5, and 2 dimensions. 
Variables r, r_last and v are set to vectors {0,0}*/

    for (int i=0;i<nDim;i++)
        newParticle.r[i]=0.5 //just changed newParticle.r, everything else still {0,0}

    newParticleList.push_back(newParticle);

出于某种原因,当我执行最后一步时,刚刚插入的列表成员的r_last向量的值将更改为r向量的值。所以,如果我打印出newParticle.r_last,它会给我{0,0},但是如果打印出列表的成员:

auto ii=newParticleList.end();
ii--;
Particle p=*ii;
for(int i=0;i<p.size();i++)
    cout<<p.r_last[i];

我得到{0.5,0.5},这是p.r的值。如果我在这一点之后更改了r向量,它不会影响r_last的值...只有当我执行push_back时它才会产生这种效果。我尝试过不同的计算机,删除了优化标记,尝试了push_front和insert,它仍然是相同的行为。有没有人对可能导致这种情况的原因有所了解?

谢谢!

亚洲时报Siddharth

1 个答案:

答案 0 :(得分:2)

这里Particle p=*ii;您创建了Particle对象的副本。因此,请检查您的复制构造函数Particle(const Particle& p);。可能会错误地将p.r复制到p.r_last