我的使用class,struct以及union如下:
class 对于有行为的对象.struct 用于被动数据.union 对于需要以不同类型访问不同数据的特殊情况.很久以前我union在谷歌C++风格指南中读过这个(除了这一点),从那时起我就一直关注它.
使用structs来传递被动数据(没有附加到对象的行为的对象)具有成员默认公共性的优点,因此可以在没有Getters和Setter的情况下访问它们.如果在分配之前需要检查/修改某些成员数据,或者在获取之前需要计算/修改某些成员数据,则恕我直言他们需要一个Setter/Getter对,而对象是a class而不是a struct.
对于union类型,我发现它对某些需要对成员进行奇怪访问的数据结构很有用,或者需要某些成员在某些上下文中被视为另一种类型.例如3D矢量或IP地址:
union 3DVector
{
double x, y, z;
double vector[3];
} v;
// Acess members with name
v.x = 6.0; v.y = 7.0; v.z = 8.0;
// Acess members as a vector
Normalize(v.vector);
union IPAddress
{
int binary;
char octet[4];
} ip;
// Acess the binary address
std::cout << std::hex << ip.binary << '\n';
// Print in a human-readable form
std::cout << static_cast<int>(ip.octet[0]) << '.'
<< static_cast<int>(ip.octet[1]) << '.'
<< static_cast<int>(ip.octet[2]) << '.'
<< static_cast<int>(ip.octet[3]) << '\n';
Run Code Online (Sandbox Code Playgroud)
上述功能可以实现重载运算符和转换运算符,但这种union方法看起来很整洁.
该unionS可也作为模板,并可以有构造函数/析构函数,这可能是序列化的目的(并不适用于所有对象的)有用:
template <typename T> union Serializer
{
Serializer(const T &o) : object(o) {}
T object;
char binary[sizeof(T)];
};
SomePODObject obj; // Only POD objects please!
Serializer s(obj);
SendBuffer(s.binary);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9083 次 |
| 最近记录: |