在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 field和Initialize parent's protected members with initialization list (C++)解释了原因。
因此,我有以下两个问题:
更新:使用建议的聚合初始化,即
mybuf() : buf{0, 0} {}
有效,但需要C ++ 11。因此,我添加了以下问题:
使用C ++ 03,是否有比使用以下构造函数更好的方法来实现所需的结果?
mybuf() {
data = 0;
count = 0;
}
答案 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};
};