【发布时间】:2016-08-20 04:04:20
【问题描述】:
我对 C++ 还很陌生,但这让我很困惑。我正在编写一个 RPG 的基本代码,但是班上的这个角色让我很难过。我已经在这里隔离了有问题的部分(剪掉了 1000 行),但问题仍然存在。
这是程序的类和标题:
#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;
}
下一部分让我摸不着头脑。我开始了以下代码:
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;
}
现在据我所知,这没有任何问题 - (GCC) 编译器不会抱怨,而且在某种程度上它工作得很好。但是如果我运行它,我会得到以下输出:
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.
更糟糕的是,如果我选择选项“2”,则只有在没有意义的情况下输出是相同的:
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.
换句话说,预期的输出在PlayerCharacterCreation() 的最后一行和PlayerCreationTest() 的下一行之间出现了严重错误。
据我所知,“字符”类应该在函数之间保持不变,而不是像这样随意更改。
我希望这足以让某人找出我做错了什么,但我只是在玩弄它并设法进一步改变输出字符。
通过在主函数的开头添加“srand(0)”行,我可以将选项 1 和 2 的“@”更改为“y”。
通过在主函数的开头添加“GenderTest()”行,我可以将“@”更改为“F”,两个选项。如果我同时添加这两行,那么只有“PlayerCreationTest()”行上方的那一行似乎很重要。这很奇怪,因为完整的代码总是返回一个 'l'(小写 L)而不是 '@',而且 main 函数和上面写的完全一样。
【问题讨论】:
-
阅读“按价值”和“按参考”的概念。
PlayerCharacterCreation()的参数是按值传递的,而您期望的行为是由通过引用传递的参数组成的。