C++ union 用于存储特定于案例的数据

C++ union usage to store case specific data

假设我为一个人存储数据。并且取决于它是男性还是女性,特定数据也将被存储。现在我应该使用 Union 来存储特定性别的部分吗?这是一个好的做法还是有更好的方法,尤其是使用 C++14?

Union 仅适用于基本类型,不适用于 classes。您的工会中不能有 std::string。因此union在C++中很少使用,而在C中使用较多。

对于你的情况,我会保持简单。最简单的方法是让所有数据成员都在同一个 class 中,无论性别如何,只使用正确的成员。

class Person
{
   // common stuff
   int age;
   int height;

   // female specific stuff
   // ???

   // male specific stuff
   // ???
};

或者你可以像这样使用继承:

class Person {};
class FemalePerson : public Person {};
class MalePerson : public Person {};

并且仅在相应派生的 class 中具有性别特定部分。

您可以在 class

中声明一个未命名的联合
class Person
{
    int gender;
    // common stuff, which is empty in your case
    int age;
    int height;

    union {
        struct {
            // female specific stuff
            // ???
        } female;

        struct {
            // male specific stuff
            // ???
        } male;
    }
};

然后使用

Person p;
switch (p.gender)
{
case MALE:
    p.male.some_attribute = somevalue;
    break;
case FEMALE:
    p.female.some_attribute = somevalue;
    break;
}

如果男性和女性之间没有共同的 属性 名称,您甚至可以删除结构的名称,因此您只需要直接使用 p.some_male_attributep.some_female_attribute 而无需其他点。