我有一个称为粒子的类,另一个称为粒子列表的类,它本质上是粒子列表以及一些其他功能。当我尝试将新粒子插入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,但仍然是相同的行为。有谁知道可能是什么原因造成的?
谢谢!
悉达思
最佳答案
在这里,您可以创建Particle p=*ii;
对象的副本。因此,请检查您的副本构造器Particle
。可能是由于将Particle(const Particle& p);
错误地复制到p.r
中。