Inizializzazione dei membri durante l'ereditarietà dalla struttura C esterna

Inizializzazione dei membri durante l'ereditarietà dalla struttura C esterna


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:



  1. Il codice fornito è semplicemente sbagliato o mi mancano alcuni aspetti rilevanti? (Dopo tutto, l'articolo sembra derivare da una fonte attendibile)

  2. 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:



  1. 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}
{}