我需要定义一个这样的类:
class Color
{
private:
union Data
{
unsigned int intValue;
unsigned char argbBytes[4];
}
private:
Data m_data;
};
Run Code Online (Sandbox Code Playgroud)
另一种方法当然是将数据定义为整数,并在必要时将其转换为char数组.
我想知道哪一个是首选方式.这里的矛盾是,我有远程记忆,有人提醒不再使用联合,但在这种情况下它似乎是一个更清洁的解决方案.
Jas*_*ams 22
工会可以很好,只要你仔细使用它们.
它们可以以两种方式使用:
允许以多种方式访问单一类型的数据(如在您的示例中,将颜色作为int或(您可能想要的)访问四个字符)
创建多态类型(例如,可以包含int或float的单个值).
情况(1)很好,因为你没有改变类型的含义 - 你可以读取和写入联盟的任何成员而不会破坏任何东西.这使得它以一种非常方便有效的方式以稍微不同的形式访问相同的数据.
情况(2)可能很有用,但是非常危险,因为您需要始终从联合内部访问正确类型的数据.如果你写一个int并尝试将它作为一个浮点数读回来,你将得到一个毫无意义的值.除非内存使用是您的首要考虑因素,否则最好使用一个包含两个成员的简单结构.
工会过去在C中至关重要.在C++中,通常有更好的方法来实现相同的目的(例如,一个类可以用来包装一个值并允许以不同的方式访问它).但是,如果您需要原始性能或存在严重的内存情况,工会仍可能是一种有用的方法.
这是好习惯吗?是的,但有一些警告.
在记忆稀缺的日子里,工会很受欢迎,可以重复使用记忆.那些日子早已过去,为此目的使用工会增加了不必要的复杂性.不要这样做.
如果一个联盟真正描述了你的数据,就像你给出的例子那样,那么这是完全合理的事情.但是,请注意,您正在构建一些平台依赖项.在具有不同整数大小或不同字节顺序的不同平台上,您可能无法获得您期望的结果.
小智 6
在C++中,联合的使用受到其成员必须是POD(普通旧数据)这一事实的限制.例如,union成员不能有构造函数或析构函数,以及其他限制.