В Смесване на 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++: Инициализация на наследени поле и Инициализиране на защитените членове на родителя със списък за инициализация (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