改变其他类对象状态的成员函数

时间:2015-02-08 18:19:46

标签: c++11 vector

我有一个非常快速的问题。我在我的代码中偶然发现了一个(奇怪的)错误。我有一个类,其中包含另一个类的实际对象的容器(矢量)。在一个函数中,我尝试更新对象的状态,这应该不是问题。在本地,在函数内部,它工作正常。对象被改变了。但是,当我退出成员函数(或只是for循环!)并读取对象'状态我看到没有任何改变!很奇怪。你们知道为什么吗?我没有使用指向向量中的对象的指针,这可能是问题吗?以下是重要代码的片段:

template<typename T>
class Particle
{
    private:
        std::array<T,3> position;
        std::array<T,3> nextPosition;
        //[...]
    public:
        void SetPosition(T rx, T ry, T rz);
        void SetPosition(std::array<T,3> update);
        void SetNextPosition(std::array<T,3> update);
        std::array<T,3> GetNextPosition();
        std::array<T,3> GetPosition();
        //[...]
};
template <typename T>
void Particle<T>::SetPosition(std::array<T,3> update){this->position = update;}
template <typename T>
std::array<T,3> Particle<T>::GetPosition(){return this->position;}
template <typename T>
std::array<T,3> Particle<T>::GetNextPosition(){return this->nextPosition;}

Box类有std::vector<Particle<T> > pList;作为私有变量,我正确加载了粒子。一切顺利,我可以改变状态,直到我调用以下函数,该函数应该移动粒子的位置状态(但是当它在for循环之外时它不会!)。所以说清楚;当我打印出for循环中对象的状态时,它似乎工作得很好。但是当for循环完成/终止时,对象根本没有改变!

template <typename T>
void Box<T>::Simulate(unsigned int timestep, T verletstep){
     //[...]
     for(auto x:this->pList) x.SetPosition( x.GetNextPosition() );
     //[...]
}

谁能明白为什么? 欣赏它!

1 个答案:

答案 0 :(得分:0)

你到处都在制作副本,尤其是在这里:

for(auto x:this->pList)

开始介绍使用引用;例如:

for(auto& x:this->pList)