una tierra texto novela literatura interna externa estructura ejemplos cuento c++ c inheritance struct init

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:

  1. ¿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)
  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 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:

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