首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何有条件地初始化结构的成员?

问如何有条件地初始化结构的成员?
EN

Stack Overflow用户
提问于 2022-12-03 09:39:44
回答 1查看 71关注 0票数 -3

我开始学习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未初始化,但它可以运行:

代码语言:javascript
复制
#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国籍=美国人”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-12-03 19:11:26

以下是使用构造函数和setter处理它的几种不同方法。请记住,添加参数化构造函数意味着结构没有默认构造函数,因此需要特别注意将其放在数组中等等。添加默认构造函数留给您。我建议将成员变量设置为私有变量,并提供方法来设置它们,这样您就可以添加错误检查并保留不变量,比如保持两个性别变量保持同步。

我添加#include <string>是因为您应该始终包含所使用的内容,而不应该依赖其他文件来包含它,因为情况可能并不总是这样,并且删除了using namespace std;,因为这是一个坏习惯。有关更多信息,请阅读为什么“使用命名空间std;”被认为是不好的做法?。

代码语言:javascript
复制
#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;
}

演示

输出:

代码语言:javascript
复制
Name = Mike, Gender = male, Age = 50, Nationality = American
Name = Mike, Gender = female, Age = 50, Nationality = American
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74665520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档