In Mixing C and C++ Code in the Same Program the following example (slightly abbreviated here to the relevant parts) is given. Assume buf.h
contains the following:
struct buf {
char* data;
unsigned count;
};
// some declarations of existing C functions for handling buf...
It is then recommended to use
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)...
};
in order to use the struct within C++ with added features.
However, this clearly will produce the following error:
error: class `mybuf' does not have any field named `data'
error: class `mybuf' does not have any field named `count'
The reasons for this are explained in How can I initialize base class member variables in derived class constructor?, C++: Initialization of inherited field, and Initialize parent's protected members with initialization list (C++).
Thus, I have the following two questions:
- Is the code provided just plainly wrong or am I missing some relevant aspect? (After all, the article seems to stem from a reputable source)
- What is the correct way to achieve the desired effect (i.e., turning a C struct into a C++ class and adding some convenience methods like, e.g., a constructor, etc.)?
Update: Using aggregation initialization as suggested, i.e.,
mybuf() : buf{0, 0} {}
works, but requires C++11. I therefore add the following question:
Using C++03, is there a better way to achieve the desired outcome than using the following constructor?
mybuf() { data = 0; count = 0; }