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_attribute
或 p.some_female_attribute
而无需其他点。
假设我为一个人存储数据。并且取决于它是男性还是女性,特定数据也将被存储。现在我应该使用 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_attribute
或 p.some_female_attribute
而无需其他点。