c++ - tierra - estructura interna de un texto ejemplos
Inicialización de miembros al heredar de una estructura externa C (4)
Esto no tiene nada que ver con mezclar C y C ++. Estás tratando de inicializar miembros que no existen; Que existan en una clase base no es suficiente. Necesitas inicializar la base en sí.
En este caso, utilice inicialización agregada:
class mybuf : public buf
{
public:
mybuf() : buf{0, 0} {}
};
En el Código de mezcla C y C ++ en el mismo programa, se proporciona el siguiente ejemplo (ligeramente abreviado aquí a las partes relevantes). Supongamos que 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)...
};
con el fin de utilizar la estructura dentro de C ++ con características añadidas.
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 para esto se explican en ¿Cómo puedo inicializar las variables de miembros 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 simplemente erróneo o me falta 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 de conveniencia como, por ejemplo, un constructor, etc.)?
Actualización : utilizando la inicialización de agregación como se sugiere, es decir,
mybuf() : buf{0, 0} {}
Funciona, pero requiere C ++ 11. Por eso añado la siguiente pregunta:
Usando C ++ 03, ¿hay una mejor manera de lograr el resultado deseado que usar el siguiente constructor?
mybuf() { data = 0; count = 0; }
Si puede usar un compilador compatible con c ++ 11, este sería un caso de uso perfecto para una lista de inicializadores utilizando inicialización agregada .
mybuf() : buf{0, 0}
{}
Una forma "correcta", si su compilador es capaz de C ++ 11, es usar, por ejemplo,
mybuf() : buf{0, 0} {}
class mybuf : public buf {
public:
mybuf();
// add new methods here (e.g. wrappers for existing C functions)...
};
const buf init = {0,0};
mybuf::mybuf() : buf(init) {};
trabajará.
He visto este trabajo con algunos compiladores, pero no tengo un estándar práctico para comprobar si es estándar o una extensión.
class mybuf : public buf {
public:
mybuf() : buf(init) { }
// add new methods here (e.g. wrappers for existing C functions)...
private:
const buf init = {0,0};
};