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:
- ¿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)
- ¿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:
-
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}
{}