In Mixing C e C++ Code nello stesso programma viene fornito il seguente esempio (qui leggermente abbreviato nelle parti pertinenti). Assumi buf.h
contiene quanto segue:
struct buf {
char* data;
unsigned count;
};
// some declarations of existing C functions for handling buf...
Si consiglia quindi di 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)...
};
per utilizzare la struttura all'interno di C++ con funzionalità aggiuntive.
Tuttavia, questo produrrà chiaramente 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 di ciò sono spiegate in Come posso inizializzare le variabili dei membri della classe base nel costruttore della classe derivata?, C++:Inizializzazione del campo ereditato e Inizializzare i membri protetti del genitore con l'elenco di inizializzazione (C++).
Quindi, ho le seguenti due domande:
- Il codice fornito è semplicemente sbagliato o mi mancano alcuni aspetti rilevanti? (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 pratici come, ad esempio, un costruttore, ecc.)?
Aggiorna :Utilizzo dell'inizializzazione dell'aggregazione come suggerito, ovvero
mybuf() : buf{0, 0} {}
funziona, ma richiede C++11. Aggiungo quindi la seguente domanda:
-
Utilizzando C++03, esiste un modo migliore per ottenere il risultato desiderato rispetto all'utilizzo del costruttore seguente?
mybuf() {
data = 0;
count = 0;
}
Risposte:
Se puoi utilizzare un compilatore compatibile con c++11, questo sarebbe un caso d'uso perfetto per un elenco di inizializzatori che utilizza l'inizializzazione aggregata.
mybuf() : buf{0, 0}
{}