将成员添加到现有结构而不破坏遗留代码

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结构的性质.

所以我想我有几个问题:

  1. 有没有一种安全的方法可以确保mVlanPriority遗留代码中的设置为0而不更新遗留代码?
  2. 如果这不再是一个POD类型,那么该类会有什么用处呢?

Mur*_* VP 5

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)