我开始学习C++结构。在创建了一个名为Person的结构之后,我尝试在Person的结构中声明一个名为genderBoolean的布尔变量,以及一个名为性别的字符串变量。我试着用if-else语句来表示以下条件:如果genderBoolean为真,那么性别为男性,但如果genderBoolean为假,则性别为女性。我试图将if- IDE语句放在结构之外,但是IDE说
标识符"genderBoolean“未定义
这会导致另一个编译错误。
似乎不能在C++中的struct中使用if-C++语句。我发现在if语句之前添加一个#并添加#endif可以解决Microsoft Visual Code 2022中“预期声明”的编译错误,但是程序的输出是:
姓名=迈克性别=年龄= 50国籍=美国人
我期望它的输出是:"Name = Mike性别=男性年龄= 50国籍=美国人“
我的代码还生成编译消息,说明变量genderBoolean未初始化,但它可以运行:
#include <iostream>
using namespace std;
int main() {
struct Person {
string name;
bool genderBoolean;
string gender;
string age;
string nationality;
#if(genderBoolean == true) {
gender = "male";
}
else if (genderBoolean == false) {
gender = "female";
}
#endif
};
Person person1;
person1.name = "Mike";
person1.genderBoolean = true;
person1.age = "50";
person1.nationality = "American";
cout << "Name = " << person1.name << " Gender = " << person1.gender <<
" Age = " << person1.age << " Nationality = " << person1.nationality <<
endl;
return 0;
}我试图将if- but语句放在结构之外,但是它说标识符"genderBoolean“是未定义的。
我期望它的输出是:"Name = Mike性别=男性年龄= 50国籍=美国人“
实际结果是:“姓名=迈克性别=年龄= 50国籍=美国人”
发布于 2022-12-03 19:11:26
以下是使用构造函数和setter处理它的几种不同方法。请记住,添加参数化构造函数意味着结构没有默认构造函数,因此需要特别注意将其放在数组中等等。添加默认构造函数留给您。我建议将成员变量设置为私有变量,并提供方法来设置它们,这样您就可以添加错误检查并保留不变量,比如保持两个性别变量保持同步。
我添加#include <string>是因为您应该始终包含所使用的内容,而不应该依赖其他文件来包含它,因为情况可能并不总是这样,并且删除了using namespace std;,因为这是一个坏习惯。有关更多信息,请阅读为什么“使用命名空间std;”被认为是不好的做法?。
#include <iostream>
#include <string>
enum class Gender
{
Male,
Female
};
struct Person
{
std::string name;
bool genderBoolean;
std::string gender;
std::string age;
std::string nationality;
Person(const std::string& name, Gender genderType,
const std::string& age, const std::string& nationality)
: name(name)
, genderBoolean(genderType == Gender::Male)
// A way to initialize the gender
, gender(genderType == Gender::Male ? "male" : "female")
, age(age)
, nationality(nationality)
{
// A way to assign the gender
// If you use this remove the one above
// You don't need both
//if (genderBoolean)
//{
// gender = "male";
//}
//else
//{
// gender = "female";
//}
}
void setGender(Gender genderType)
{
// A way to change the gender
// Would be best if the member variables were private
// But would not prevent the class from making them mismatch
// by modifying the gender variable directly
if (genderType == Gender::Male)
{
gender = "male";
}
else
{
gender = "female";
}
}
friend std::ostream& operator<<(std::ostream& out, const Person& p);
};
std::ostream& operator<<(std::ostream& out, const Person& p)
{
out << "Name = " << p.name
<< ", Gender = " << p.gender
<< ", Age = " << p.age
<< ", Nationality = " << p.nationality
<< "\n";
return out;
}
int main()
{
Person person1("Mike", Gender::Male, "50", "American");
std::cout << person1;
person1.setGender(Gender::Female);
std::cout << person1;
return 0;
}输出:
Name = Mike, Gender = male, Age = 50, Nationality = American
Name = Mike, Gender = female, Age = 50, Nationality = Americanhttps://stackoverflow.com/questions/74665520
复制相似问题