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

时间:2015-04-20 10:44:18

标签: c++ c inheritance struct init

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++)解释了原因。

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

  1. 提供的代码是完全错误还是我错过了一些相关方面? (毕竟,这篇文章似乎来自一个有信誉的来源)
  2. 实现所需效果的正确方法是什么(即将C结构转换为C ++类并添加一些方便的方法,例如构造函数等)?
  3. 更新:使用建议的聚合初始化,即

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

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

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

      mybuf() {
        data = 0;
        count = 0;
      }
      

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

一个"正确"方式,如果您的编译器支持C ++ 11,则使用例如。

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

答案 2 :(得分:3)

这与混合C和C ++无关。您正在尝试初始化不存在的成员;它们存在于基类中是不够的。你需要初始化基础本身。

在这种情况下,使用聚合初始化:

class mybuf : public buf
{
public:
    mybuf() : buf{0, 0} {}
};

答案 3 :(得分:2)

class mybuf : public buf {
public:
    mybuf();    
    // add new methods here (e.g. wrappers for existing C functions)...
};

const buf init = {0,0};

mybuf::mybuf() : buf(init) {};

会奏效。

我已经看过一些编译器的这项工作,但是没有标准的方便来检查它是标准的还是扩展的。

class mybuf : public buf {
public:
    mybuf() : buf(init) { }

    // add new methods here (e.g. wrappers for existing C functions)...

    private:

    const buf init = {0,0};
};