Inicialización de miembros al heredar de la estructura C externa

Inicialización de miembros al heredar de la estructura C externa


En Mezclar código C y C++ en el mismo programa, se proporciona el siguiente ejemplo (ligeramente abreviado aquí para las partes relevantes). Asumir buf.h contiene lo siguiente:


struct buf {
char* data;
unsigned count;
};
// some declarations of existing C functions for handling buf...

Entonces se recomienda usar


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)...
};

para usar la estructura dentro de C++ con funciones adicionales.


Sin embargo, esto claramente producirá el siguiente error:


error: class `mybuf' does not have any field named `data'
error: class `mybuf' does not have any field named `count'

Las razones de esto se explican en ¿Cómo puedo inicializar las variables miembro de la clase base en el constructor de clases derivadas?, C++:Inicialización del campo heredado e Inicializar los miembros protegidos de los padres con la lista de inicialización (C++).


Por lo tanto, tengo las siguientes dos preguntas:



  1. ¿El código proporcionado es claramente incorrecto o me estoy perdiendo algún aspecto relevante? (Después de todo, el artículo parece provenir de una fuente confiable)

  2. ¿Cuál es la forma correcta de lograr el efecto deseado (es decir, convertir una estructura C en una clase C++ y agregar algunos métodos convenientes como, por ejemplo, un constructor, etc.)?


Actualizar :Usando la inicialización de agregación como se sugiere, es decir,


mybuf() : buf{0, 0} {}

funciona, pero requiere C++11. Por lo tanto, agrego la siguiente pregunta:



  1. Usando C++03, ¿hay una mejor manera de lograr el resultado deseado que usando el siguiente constructor?


    mybuf() {
    data = 0;
    count = 0;
    }


Respuestas:


Si puede usar un compilador compatible con c++ 11, este sería un caso de uso perfecto para una lista de inicializadores que usa inicialización agregada.


mybuf() : buf{0, 0}
{}