Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用C++中更改私有变量的方法_C++ - Fatal编程技术网

调用C++中更改私有变量的方法

调用C++中更改私有变量的方法,c++,C++,我有3个职业,玩家,怪物和攻击 Class Player { public: void addMonster(string line); // ... } Class Monster { public: void addAttack(); // ... private: vector <Attack> _attacks; } 这似乎是可行的,如果我在addAttack中检查_攻击的内容,它会将正确的元素推入,攻击的大小会发生变化,并且会发生变化

我有3个职业,玩家,怪物和攻击

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);
}