Leo*_*Hat 12 c++ struct value-initialization
我正在使用的一些遗留代码中有以下定义.
struct VlanData
{
uint16_t mEtherType;
uint16_t mVlanId;
};
Run Code Online (Sandbox Code Playgroud)
我想在这个结构中添加一个新成员:
struct VlanData
{
uint16_t mEtherType;
uint16_t mVlanId;
uint8_t mVlanPriority; // New member
};
Run Code Online (Sandbox Code Playgroud)
但是,VlanData遗留代码的使用相当不一致.
VlanData myVlans;
myVlans.mEtherType = 0x8100;
myVlans.mVlanId = 100;
Run Code Online (Sandbox Code Playgroud)
VlanData myVlans = { 0x8100, 100 };
Run Code Online (Sandbox Code Playgroud)
我想要做的是提出一种安全的方法来确保遗留代码中的"mVlanPriority"自动设置为0,而无需更新大量代码.
我知道我可以修改遗留代码来对所有成员进行值初始化,如下所示:
VlanData myVlans = {};
Run Code Online (Sandbox Code Playgroud)
但我不想更新所有这些代码.我相信创建这样的默认构造函数会有所帮助:
VlanData()
: mEtherType(0),
mVlanId(0),
mVlanPriority(0)
{}
Run Code Online (Sandbox Code Playgroud)
但这也会破坏POD结构的性质.
所以我想我有几个问题:
mVlanPriority遗留代码中的设置为0而不更新遗留代码? POD类型,那么该类会有什么用处呢?struct VlanData {
struct P
{
uint8_t operator=(uint8_t v) { mVlanPriority = v; }
uint8_t mVlanPriority; P() { mVlanPriority = 0; };
};
uint16_t mEtherType;
uint16_t mVlanId;
P mVlanPriority;
};
Run Code Online (Sandbox Code Playgroud)
定义其他类型的运算符并根据需要添加类型转换函数.
例如:
int main(int argc, char** argv)
{
VlanData myVlans0 = { };
VlanData myVlans = { 0x8100, 100 };
myVlans.mVlanPriority = 10;
}
Run Code Online (Sandbox Code Playgroud)