gpt4 book ai didi

c++ - 我可以在内存初始化器中初始化 union 吗?

转载 作者:可可西里 更新时间:2023-11-01 16:26:01 25 4
gpt4 key购买 nike

我很惊讶这不起作用:

union DlDatum
{
float mFloat;
s32 mInteger;
};

class DlDbE
{
public:
DlDbE( float f ) : mData.mFloat( f ) {};
private:
DlDatum mData;
};

有没有办法在 C++ 构造函数内存初始化器列表中初始化 union ?

更新:答案是为 union 创建构造函数。不知道那可以做到。这是我所做的:

union DlDatum
{
float mFloat;
s32 mInteger;
bool mBoolean;
u32 mSymbol;
u32 mObjIdx;

DlDatum( ) : mInteger( 0 ) {}
DlDatum( float f ) : mFloat( f ) {}
DlDatum( s32 i ) : mInteger( i ) {}
DlDatum( bool b ) : mBoolean( b ) {}
DlDatum( u32 s ) : mSymbol( s ) {} // this ctor should work for objIdx also
};

class DlDbE
{
public:
DlDbE() {}
DlDbE( float f ) : mData( f ) {}
DlDbE( u32 i ) : mData( i ) {}
DlDbE( bool b ) : mData( b ) {}
...etc..
private:
DlDatum mData;
};

最佳答案

在 C++03 和之前,您只能为 union 编写构造函数。

在 C++11 中,统一初始化 将聚合初始化的语法扩展到构造函数初始化列表。这意味着像

这样的好旧聚合初始化器语法
DlDatum d = { 3.0 };

我们都知道并喜爱 C 并初始化 union 的第一个成员,现在也可以在构造函数初始化列表中使用

union DlDatum
{
float mFloat;
s32 mInteger;
};

class DlDbE
{
public:
DlDbE( float f ) : mData{f} {}
private:
DlDatum mData;
};

此功能仅允许您“定位” union 体的第一个非静态成员进行初始化。如果您需要更灵活的东西,那就回到编写构造函数。

关于c++ - 我可以在内存初始化器中初始化 union 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13056366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com