调用C++中更改私有变量的方法
我有3个职业,玩家,怪物和攻击调用C++中更改私有变量的方法,c++,C++,我有3个职业,玩家,怪物和攻击 Class Player { public: void addMonster(string line); // ... } Class Monster { public: void addAttack(); // ... private: vector <Attack> _attacks; } 这似乎是可行的,如果我在addAttack中检查_攻击的内容,它会将正确的元素推入,攻击的大小会发生变化,并且会发生变化
Class Player
{
public:
void addMonster(string line);
// ...
}
Class Monster
{
public:
void addAttack();
// ...
private:
vector <Attack> _attacks;
}
这似乎是可行的,如果我在addAttack中检查_攻击的内容,它会将正确的元素推入,攻击的大小会发生变化,并且会发生变化,
但是当程序返回addMonster时,mn的_攻击向量仍然或再次为空,好像它根本没有调用该方法。
为什么?
这就好像被修改的对象只是调用该方法的对象的副本,因此原始对象不受影响,但我应该如何更改该特定对象的向量?当您在addAtack中创建*att指针时,您在堆栈上创建了它。堆栈变量在其原始函数结束时被删除,因此att在add攻击的and处被删除。一个可能的解决办法是在堆上创建ATT,使用关键字new。类不会在C++中编译。请尝试创建一个并显示给我们吗?因为现在很难说清楚。你的操作符=攻击类深度复制吗?您可能正在addAttack中创建一个新对象,然后在退出Scope时删除该对象,但推送取消引用的值会将该对象复制到向量中。是的,这就是为什么在这种情况下,最好使用攻击指针向量,而不是攻击指针向量。不需要指针,除非攻击是具有虚拟成员函数的基类。复制对象是很好的,事实上,除了多态性,很少有需要在现代C++中使用指针。
void Player::addMonster(string line){
//...
Monster mn(line); //creates a new monster
while(condition){
mn.addAttack();
}
}
void Monster::addAttack(){
//...
Attack *att = gio->findAttack(ID) //takes the attack from another part of the program
_attacks.push_back(*att);
}