从extern C struct继承时成员的初始化

god*_*lka 17 c c++ inheritance struct init

同一程序中混合使用C和C++代码时,给出了以下示例(此处略微缩写为相关部分).假设buf.h包含以下内容:

struct buf {
    char* data;
    unsigned count;
};

// some declarations of existing C functions for handling buf...
Run Code Online (Sandbox Code Playgroud)

然后建议使用

extern "C" {
  #include "buf.h"
}

class mybuf : public buf {
public:
    mybuf() : data(0), count(0) { }

    // add new methods here (e.g. wrappers for existing C functions)...
};
Run Code Online (Sandbox Code Playgroud)

为了在C++中使用带有附加功能的结构.

但是,这显然会产生以下错误:

error: class `mybuf' does not have any field named `data'
error: class `mybuf' does not have any field named `count'
Run Code Online (Sandbox Code Playgroud)

解释的原因在如何在派生类构造函数中初始化基类成员变量中进行了解释,C++:继承字段的初始化,以及使用初始化列表(C++)初始化父的受保护成员.

因此,我有以下两个问题:

  1. 提供的代码是完全错误还是我错过了一些相关方面?(毕竟,这篇文章似乎来自一个声誉良好的来源)
  2. 实现所需效果的正确方法是什么(即将C结构转换为C++类并添加一些方便的方法,例如构造函数等)?

更新:使用建议的聚合初始化,即

mybuf() : buf{0, 0} {}
Run Code Online (Sandbox Code Playgroud)

有效,但需要C++ 11.因此,我添加以下问题:

  1. 使用C++ 03,是否有比使用以下构造函数更好的方法来实现所需的结果?

    mybuf() {
      data = 0;
      count = 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)

Sim*_*ons 8

如果您可以使用兼容c ++ 11的编译器,那么这将是使用聚合初始化的初始化列表的完美用例.

mybuf() : buf{0, 0}
{}
Run Code Online (Sandbox Code Playgroud)