In Mixing C and C++ Code in the Same Program wird das folgende Beispiel (hier zu den relevanten Teilen leicht abgekürzt) gegeben. Angenommen, buf.h
enthält folgende Komponenten:Initialisierung von Elementen beim Erben von extern C struct
struct buf {
char* data;
unsigned count;
};
// some declarations of existing C functions for handling buf...
Es wird dann empfohlen
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)...
};
zu verwenden, um die Struktur in C++ mit zusätzlichen Funktionen zu verwenden.
Dies ist jedoch eindeutig den folgenden Fehler erzeugen:
error: class `mybuf' does not have any field named `data'
error: class `mybuf' does not have any field named `count'
Die Gründe dafür erläutert in How can I initialize base class member variables in derived class constructor?, C++: Initialization of inherited field und Initialize parent's protected members with initialization list (C++).
So, ich habe die beiden folgenden Fragen:
- Ist der Code nur einfach falsch versehen oder bin ich einige relevante Aspekt fehlt? (Schließlich scheint der Artikel von einer seriösen Quelle zu stammen)
- Was ist der richtige Weg, um den gewünschten Effekt zu erzielen (dh, eine C-Struktur in eine C++ - Klasse umzuwandeln und einige bequeme Methoden wie z. B. einen Konstruktor hinzuzufügen, etc.)?
aktualisieren: Mit Aggregation Initialisierung, wie vorgeschlagen, das heißt
mybuf() : buf{0, 0} {}
Werke, sondern erfordert C 11 ++. Ich füge daher die folgende Frage hinzu:
Mit C++ 03 gibt es eine bessere Möglichkeit, das gewünschte Ergebnis zu erzielen als mit dem folgenden Konstruktor?
mybuf() { data = 0; count = 0; }
Sieht aus wie ein Copy & Paste Bug. Zuvor hat der Autor eine Klasse 'mybuf' mit' data'- und 'count'-Membern implementiert. – dyp
Warum legen Sie ein externes "C" um Ihre Struktur? Es besteht kein Bedarf. –
@CyberSpock Siehe die ursprüngliche Quelle des Codes, dies ist über Mischen von C-und C++ - Code und die Header-Datei enthält einige Funktionsdeklarationen, ich habe den Code oben, um dies klar zu machen. – godfatherofpolka