私はParticleと呼ばれるクラスと、ParticleListと呼ばれるクラスを持っています。これは本質的にList of Particlesといくつかの他の関数です。 ParticleListに新しいパーティクルを挿入しようとすると、私はいくつかの奇妙な振る舞いに気づいています。なぜそれが起こっているのだろうかと思っています。私は次のように粒子を挿入しようとすると、トラブルが入って来C++のリスト挿入の奇妙な振る舞い
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);
}
:
一backとpush_frontの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
};
定義:クラスは次のように定義されています
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);
Fo r何らかの理由で、私が最後のステップを行うとき、ちょうど挿入されたリストメンバーの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}を取得prこの点の後にrベクトルを変更しても、r_lastの値には影響しません。ただし、push_backを実行すると、この効果が生成されます。私は別のコンピュータを試して、最適化フラグを削除し、push_frontとinsertを試しましたが、それと同じ動作です。誰かがこれを引き起こしているかもしれないアイデアを持っていますか?
ありがとうございました!
シッダールタ
一般的なアドバイス:仮想デストラクタのないタイプから派生しないでください。これは、ほとんどのタイプの 'std'の場合です。 –
'Particle.r'を設定しましたが、' Particle.r_last'を印刷しましたが、これらの2つの間のリンクはわかりません。また、 'push_back'の実装についてはわかりません(おそらく、パラメータを取って以来、宣言していないでしょう...)、' push_back'の中におそらく 'Particle'のコピーコンストラクタがありますが、その実装。デフォルトでは、 'ParticleList :: push_back'は' const particle 'で 'list :: push_back'を呼び出し、' r_back'ではなく 'r'を出力するだけです。コードは動作しますので、[MCVE]( https://stackoverflow.com/help/mcve)。 – Holt
私は心からの謝罪をして、push_backとpush_frontの宣言でタイプミスを犯しました。パーティクルを引数として参照します。これを修正して、両方の関数の定義を追加しました。 –