Nel Mixing C and C++ Code in the Same Program viene fornito il seguente esempio (leggermente abbreviato qui per le parti pertinenti). Si supponga buf.h
contiene:Inizializzazione dei membri quando si eredita dalla struttura esterna C
struct buf {
char* data;
unsigned count;
};
// some declarations of existing C functions for handling buf...
E 'poi consigliabile utilizzare
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)...
};
al fine di utilizzare la struct all'interno di C++ con le caratteristiche aggiunte.
Tuttavia, chiaramente produrrà il seguente errore:
error: class `mybuf' does not have any field named `data'
error: class `mybuf' does not have any field named `count'
Le ragioni sono spiegate in How can I initialize base class member variables in derived class constructor?, C++: Initialization of inherited field e Initialize parent's protected members with initialization list (C++).
Così, ho le seguenti due domande:
- è il codice fornito solo chiaramente sbagliato o mi manca qualche aspetto rilevante? (Dopo tutto, l'articolo sembra derivare da una fonte attendibile)
- Qual è il modo corretto per ottenere l'effetto desiderato (ad esempio, trasformare una struttura C in una classe C++ e aggiungere alcuni metodi di comodità come, ad esempio, un costruttore, eccetera.)?
Aggiornamento: Utilizzo inizializzazione aggregazione come suggerito, cioè,
mybuf() : buf{0, 0} {}
opere, ma richiede C++ 11. Pertanto aggiungo la seguente domanda:
Utilizzo di C++ 03, esiste un modo migliore per ottenere il risultato desiderato rispetto all'utilizzo del seguente costruttore?
mybuf() { data = 0; count = 0; }
Sembra un errore di copia e incolla. In precedenza sulla stessa pagina, l'autore ha implementato una classe 'mybuf' con i membri' data' e 'count'. – dyp
perché inserisci una "C" esterna attorno alla tua struct? non c'è bisogno. –
@CyberSpock Vedere la fonte originale del codice, si tratta di mescolare il codice C e C++ e il file di intestazione contiene alcune dichiarazioni di funzione, ho modificato il codice sopra per chiarirlo. – godfatherofpolka