类对象(char)在函数之后发生更改
Class object (char) changes after function
我对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 << "nnOUTPUT BEGINS NOWnGender: " << 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()
的下一行之间的某个地方,预期输出出现了严重错误。
不过,据我所知,"character"类在函数之间应该保持不变,而不是像这样随意更改。
我希望这足以让别人明白我做错了什么,但我有点玩弄它,并设法对输出角色进行了更多的更改。
通过在主函数的开头添加一行"srand(0(",我可以将选项1和2的"@"更改为"y"。
通过在主函数的开头添加一行"GenderTest((",我可以将'@'更改为'F',用于这两个选项。如果我同时添加这两行,那么只有"PlayerCreationTest(("行正上方的一行似乎很重要。这很奇怪,因为完整的代码总是返回一个"l"(小写l(而不是"@",并且主函数与上面写的完全相同。
不过,据我所知,"character"类在函数之间应该保持不变,而不是像这样随意更改。
你错了。它们保持不变,因为它们是独立的变量。PlayerCharacterCreation
创建一个本地character
(Test
的副本(,在函数结束时,对象被销毁。
您传递给PlayerCharacterCreation
的原始character
从未更改,并且您会得到一些奇怪的输出,因为从未为该character
设置性别。
PlayerCharacterCreation
中的Player
是一个全新的character
,它不是Test
:(
如果你想修改传递给PlayerCharacterCreation
的character
,你必须通过引用传递它(还有一些其他方法,比如传递指针,返回Player
,但这是最好的方法(:
void PlayerCharacterCreation(character& Player);
^^^
reference
void PlayerCharacterCreation(character Player)
在该函数中,Player
是character
的本地实例,调用参数被复制到其中。考虑以下内容:
#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::x
和f2::i
是从我们的源参数复制的它们自己的自变量。
如果要传递变量的特定实例而不是其副本,则需要提供指针或引用。
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
}
- 类的前向声明之后的类成员函数定义,在类声明之前
- 了解在返回值之前和之后使用 EAX 的函数调用
- 我在 C++ 中创建了一个函数来递归反转字符串,但是之后如何使功能打印一个 endl?
- 在成员构造函数之后调用基类构造函数
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- 在类的第一个/最后一个实例存在之前/之后调用一对函数.有没有更好的方法?
- 使用构造函数初始化结构还是在之后设置其值更好?
- 为什么我的类工作正常,即使在返回垃圾值作为赋值运算符和空复制构造函数的返回之后
- 在析构函数之后,围绕成员函数的C++lambda包装器是如何工作的
- C++ 在地板函数之后以十六进制打印数字
- 错误:函数声明符之后的预期函数体
- 使用 std::function 作为成员函数,它捕获"this",并在析构函数之后从复制的 lam
- 将指针传递给函数在简单的情况下有效,但在"class" -izing 之后不起作用
- 如何在析构函数中执行一些代码*在*成员被销毁之后
- 如何在构造函数之后设置引用?
- 在函数声明之后声明整数有什么用?
- 为什么函数不在特定函数之后执行
- 构造函数参数列表之后的结肠符号
- 是什么导致了构造函数之后的这些"意外令牌"错误?
- 类成员在构造函数(线程)之后更改地址