Mixing C and C++ Code in the Same Program中,给出了以下示例(此处略微缩为相关部分)。假设buf.h包含以下内容:

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

// some declarations of existing C functions for handling buf...

然后建议使用
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)...
};

为了在具有附加功能的C++中使用该结构。

但是,这显然会产生以下错误:
error: class `mybuf' does not have any field named `data'
error: class `mybuf' does not have any field named `count'

其原因在How can I initialize base class member variables in derived class constructor?C++: Initialization of inherited fieldInitialize parent's protected members with initialization list (C++)中进行了说明。

因此,我有以下两个问题:
  • 提供的代码是否完全错误或者我缺少某些相关方面? (毕竟,这篇文章似乎源于一个有信誉的来源)
  • 什么是达到预期效果的正确方法(即将C结构转换为C++类并添加一些便捷方法,例如构造函数等)?

  • 更新:按照建议使用聚合初始化,即
    mybuf() : buf{0, 0} {}
    

    可以,但是需要C++ 11。因此,我添加了以下问题:
  • 使用C++ 03,是否有比使用以下构造函数更好的方法来实现所需的结果?
    mybuf() {
      data = 0;
      count = 0;
    }
    
  • 最佳答案

    如果可以使用与c++ 11兼容的编译器,那么这对于使用aggregate initialization的初始化列表是一个完美的用例。

    mybuf() : buf{0, 0}
    {}
    

    09-20 15:59