В Смешивание кода C и C ++ в одной программе дается следующий пример (здесь несколько сокращен до соответствующих частей). Предположим, что 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'
Причины этого объясняются в Как могу ли я инициализировать переменные-члены базового класса в конструкторе производного класса?, C ++: Инициализация унаследованных field и Инициализировать защищенные элементы родительского элемента с помощью списка инициализации (C ++ ).
Таким образом, у меня возникают следующие два вопроса:
- Представленный код явно неверен или мне не хватает какого-то важного аспекта? (В конце концов, статья, похоже, взята из авторитетного источника)
- Как правильно достичь желаемого эффекта (т.е. превратить структуру C в класс C ++ и добавить некоторые удобные методы, такие как, например, конструктор и т. Д.)?
Обновление: использование инициализации агрегирования, как предлагается, т. е.
mybuf() : buf{0, 0} {}
работает, но требует C ++ 11. Поэтому я добавляю следующий вопрос:
Есть ли лучший способ достичь желаемого результата при использовании C ++ 03, чем использование следующего конструктора?
mybuf() { data = 0; count = 0; }
mybuf
с членамиdata
иcount
. - person dyp   schedule 20.04.2015