类对象(char)在函数后更改

时间:2016-08-20 04:04:20

标签: c++ function class char

我对C ++很陌生,但这让我很难过。我正在研究一个RPG的基本代码,但是这个角色中的这个角色让我很难过。我已经把这里讨论过的作品隔离开来了(那里有1000条好线),问题仍然存在。

这是该计划的类和标题:


$ cd platform/google_appengine/google/appengine/tools/java/lib/tools/jsp
$ mv repackaged-appengine-jasper-jdt-6.0.29.jar OLD-repackaged-appengine-jasper-jdt-6.0.29.jar.OLD
$ cp ../../../jetty93/jetty-distribution/lib/apache-jsp/org.eclipse.jdt.core.compiler.ecj-4.4.2.jar .

下一部分让我摸不着头脑。我开始使用以下代码:


$ cd lib/tools/jsp
$ mv repackaged-appengine-jasper-jdt-6.0.29.jar OLD-repackaged-appengine-jasper-jdt-6.0.29.jar.OLD
$ cp ../../../jetty93/jetty-distribution/lib/apache-jsp/org.eclipse.jdt.core.compiler.ecj-4.4.2.jar .

现在据我所知,这没有任何问题 - (GCC)编译器没有抱怨,并且它可以正常工作。但如果我运行它,我得到以下输出:

#include <iostream>
#include <cstdlib>
using namespace std;

unsigned long errorcount;
// I know this is bad coding, but it's not going to be in the end product...

class character {
public:
  void setgender(char newgender);
  char getgender() const;
private:
  char gender;
};

void character::setgender(char newgender) {
  switch (newgender) {
  case 'M': gender = 'M'; break;
  case 'F': gender = 'F'; break;
  default: gender = '0'; errorcount++; break;
  }
  std::cout << "\nDuring setgender function: " << gender;
  return;
}

char character::getgender() const {
  std::cout << "\nDuring getgender function: " << gender;
  return gender;
}

更糟糕的是,如果我选择选项&#34; 2&#34;只有在没有意义的情况下,输出才是相同的:

void PlayerCharacterCreation(character Player) {
  string newgender;
  while(true) {
    std::cout << "\nAre you male or female?" << "\n1. Male" << "\n2. Female" << "\n::";
    std::cin >> newgender;
    if (newgender == "1") { Player.setgender('M'); break; }
    if (newgender == "2") { Player.setgender('F'); break; }
    std::cout << "\nInvalid response.  Try again.";
  }
  std::cout << "\nAfter setgender function: " << Player.getgender();
}

void PlayerCreationTest() {
  character Test;
  PlayerCharacterCreation(Test);
  char playergender = Test.getgender();
  if (playergender != 'M' && playergender != 'F') { errorcount++; }
  std::cout << "\nAfter getgender function: " << playergender;
  std::cout << "\n\nOUTPUT BEGINS NOW\nGender: " << playergender << "\n";
  std::cout << "OUTPUT ENDS.  Total Errors: " << errorcount << ".";
  return;
}

int main() {
  PlayerCreationTest();
  return 0;
}

换句话说,预期输出在Are you male or female? 1. Male 2. Female 1 During setgender function: M During getgender function: M After setgender function: M During getgender function: @ After getgender function: @ OUTPUT BEGINS NOW Gender: @ OUTPUT ENDS. Total Errors: 1. 的最后一行和Are you male or female? 1. Male 2. Female 2 During setgender function: F During getgender function: F After setgender function: F During getgender function: @ After getgender function: @ OUTPUT BEGINS NOW Gender: @ OUTPUT ENDS. Total Errors: 1. 的下一行之间的某处出现严重错误。

据我所知,&#34;字符&#34; class 应该在函数之间保持不变,而不是像这样不断改变所有。

我希望有足够的人能够弄清楚我做错了什么,但我正在玩弄它,并设法更改输出字符。

添加&#34; srand(0)&#34;在主要功能的开头,我可以改变&#39; @&#39;到了&#39; y对于选项1和2。

添加&#34; GenderTest()&#34;在主要功能的开头,我可以改变&#39; @&#39;到&#39; F&#39;,两个选项。如果我添加两行,只有紧跟在&#34; PlayerCreationTest()&#34;之上的那一行。线似乎很重要。这很奇怪,因为完整的代码总是返回一个&#39; l&#39; (小写L)而不是&#39; @&#39;,主要功能与上面写的完全相同。

2 个答案:

答案 0 :(得分:2)

  

据我所知,&#34;字符&#34; class应该在函数之间保持不变,而不是像这样不加改变。

嗯,你错了。它们保持不变,因为它们是单独的变量PlayerCharacterCreation创建一个本地characterTest的副本),在该函数的末尾,该对象将被销毁。

您传递给character的原始PlayerCharacterCreation从未更改,并且您获得了一些奇怪的输出,因为从未为character设置了性别。

Player中的PlayerCharacterCreation是全新character,不是Test :)

如果你想修改传递给character的{​​{1}},你必须通过引用传递它(还有其他一些方法,比如传递指针,返回PlayerCharacterCreation,但是这是最好的一个):

Player

答案 1 :(得分:1)

void PlayerCharacterCreation(character Player)

在此函数中,Playercharacter的本地实例,其中调用参数已复制。请考虑以下事项:

#include <iostream>

void f1(int x) {
    x++;
}

void f2(int i) {
    i++;
}

int main() {
    int i = 0;
    f(i);
    std::cout << i << '\n';
}

我们知道这个输出将为'0',因为f1::xf2::i是从我们的source参数复制的自己的独立变量。

如果要传递变量的特定实例而不是其副本,则需要提供指针或引用。

void by_pointer(Character* player) {
    if (player == nullptr) {
        error_handling();
    }
    player->do_thing();
}
by_pointer(&player);

void by_reference(Character& player) {
    player.do_thing();
}
by_reference(player);

示例:

#include <iostream>

int f1(int& param) {
    param++;
}

int main() {
    int i = 0;
    f1(i);
    std::cout << i << '\n';  // outputs 1
}