联合中的wstring

Oli*_*ops 0 c++

我想定义一个联合,用于读取特殊类型的二进制文件.联盟应该有两个成员,一个是int,另一个是一种字符串,或任何其他问题; 做这个的最好方式是什么?

union uu {  
    int intval;  
    wstring strval;  

    uu(){ memset(this, 0, sizeof(this)); }  
}
Run Code Online (Sandbox Code Playgroud)

它说:"工会的成员strval有复制构造函数"我认为strval应该有*或a&; 你会如何定义它?

提前谢谢
哎呀

小智 9

你不能这样做.工会成员必须是POD类型 - 即他们不得拥有构造函数或析构函数.即使你可以,你对memset的调用也会遍及整个字符串,从而导致未定义的行为.你当然可以使用指针:

union uu {  
    int intval;  
    wstring * strval;  

    uu(){ memset(this, 0, sizeof(uu)); }  
};
Run Code Online (Sandbox Code Playgroud)

  • C++ 0x添加了在联合中存储非POD类型的功能.但就目前而言,它只是POD类型. (2认同)

Joh*_*itb 5

boost.variant 是你想要使用的

boost::variant<int, wstring> v("hello");
Run Code Online (Sandbox Code Playgroud)

如果使用指针作为联合的成员,则必须分配并释放指针指向自己的字符串,最好使用newdelete.

boost::variant解决了这个问题:它分配了变体对象本身内的所有成员(因此没有用于存储成员的动态分配),并且您根本不需要做任何事情newdelete自己打电话.