次のようなクラスがあります。
class Particle()
{
void CalcSomething(Super& arg){
for(unsigned long long index = 0; index < arg.NumberOfParticle(); index ++){
if(this != arg.ParticleMemoryPointer(index)){
// Do the calculations
}
}
}
}
そして、次のクラスは粒子を保持します。
class Super()
{
const Particle* const ParticleMemoryPointer(unsigned int index)
{
std::list<Particle>::iterator iter = mParticles.begin();
std::advance(iter, index);
return &(*iter);
}
std::list<Particle> mParticles;
}
アイデアは、CalcSomething を呼び出している粒子のインスタンスが、関数内のインデックスによってアドレス指定されたものと同じ Particle のインスタンスから CalcSomething が呼び出されていることを検出する必要があるということCalcSomething
です。(それは意味がありますか?私はそれをうまく表現していません...)
この理由は、2 つの粒子間で計算を行う場合、それらが異なる粒子であることを確認する必要があるためです。
this
一部の cout ステートメントは、ParticleMemoryPointer によって返されるメモリ アドレスが、リストに 1 つの項目がある場合のポインターと同じではないことを示しています。(それらは、1 つの項目で、同じ粒子で 2 回計算を行っているはずです。)
これが理解できることを願っています。
編集CalcSomething を呼び出す Super 内部の関数:
void Super::UpdateParticles(double time_step)
{
std::list<Particle>::iterator iter = mParticles.begin();
for(unsigned long long index = 0; index < mParticles.size(); index ++){
std::advance(iter, 1);
iter->CalcSomething(*this);
}
}
編集 2 std::vector は使用できません。(私たちはあなたがそれを考えていたことを知っています!)