改变其他 class 对象状态的成员函数
Member function that alters state of object of other class
我有一个非常快速的问题。我在我的代码中偶然发现了一个(奇怪的)错误。我有一个 class,其中包含另一个 class 的实际对象的容器(向量)。在一个函数中,我尝试更新对象的状态,这应该不是问题。在本地,在函数内部,它工作正常。对象被改变。但是当我退出成员函数(或只是 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;}
盒子 class 有 std::vector<Particle<T> > pList;
作为私有变量,我正确地加载了粒子。一切顺利,我可以更改状态,直到我调用以下应该改变粒子位置状态的函数(但它不会!当在 for 循环之外时)。所以说清楚;当我打印出 for 循环内对象的状态时,它似乎工作得很好。但是当 for 循环是 finished/terminated 时,对象根本没有改变!
template <typename T>
void Box<T>::Simulate(unsigned int timestep, T verletstep){
//[...]
for(auto x:this->pList) x.SetPosition( x.GetNextPosition() );
//[...]
}
谁能看出为什么?
点赞!
你到处复制,尤其是这里:
for(auto x:this->pList)
开始介绍references的使用;例如:
for(auto& x:this->pList)
我有一个非常快速的问题。我在我的代码中偶然发现了一个(奇怪的)错误。我有一个 class,其中包含另一个 class 的实际对象的容器(向量)。在一个函数中,我尝试更新对象的状态,这应该不是问题。在本地,在函数内部,它工作正常。对象被改变。但是当我退出成员函数(或只是 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;}
盒子 class 有 std::vector<Particle<T> > pList;
作为私有变量,我正确地加载了粒子。一切顺利,我可以更改状态,直到我调用以下应该改变粒子位置状态的函数(但它不会!当在 for 循环之外时)。所以说清楚;当我打印出 for 循环内对象的状态时,它似乎工作得很好。但是当 for 循环是 finished/terminated 时,对象根本没有改变!
template <typename T>
void Box<T>::Simulate(unsigned int timestep, T verletstep){
//[...]
for(auto x:this->pList) x.SetPosition( x.GetNextPosition() );
//[...]
}
谁能看出为什么? 点赞!
你到处复制,尤其是这里:
for(auto x:this->pList)
开始介绍references的使用;例如:
for(auto& x:this->pList)