¿Cómo se hereda de una clase en un archivo de encabezado diferente?
-
05-07-2019 - |
Pregunta
Estoy teniendo problemas de dependencia. Tengo dos clases: Graphic
y Image
. Cada uno tiene sus propios archivos .cpp y .h. Los declaro como los siguientes:
Graphic.h
:
#include "Image.h"
class Image;
class Graphic {
...
};
Image.h
:
#include "Graphic.h"
class Graphic;
class Image : public Graphic {
...
};
Cuando intento compilar, aparece el siguiente error:
Image.h:12: error: expected class-name before ‘{’ token
Si elimino la declaración de reenvío de Graphic
de Image.h
, aparece el siguiente error:
Image.h:13: error: invalid use of incomplete type ‘struct Graphic’ Image.h:10: error: forward declaration of ‘struct Graphic’
Solución
Esto me funcionó:
Image.h:
#ifndef IMAGE_H
#define IMAGE_H
#include "Graphic.h"
class Image : public Graphic {
};
#endif
Graphic.h:
#ifndef GRAPHIC_H
#define GRAPHIC_H
#include "Image.h"
class Graphic {
};
#endif
El siguiente código se compila sin error:
#include "Graphic.h"
int main()
{
return 0;
}
Otros consejos
No es necesario que incluya Image.h o forward declare Image en Graphic.h, es una dependencia circular. Si Graphic.h depende de algo en Image.h, debe dividirlo en un tercer encabezado. (Si Graphic tiene un miembro de Image, eso no va a funcionar).
Graphic.h no necesita incluir image.h, y no necesita reenviar declarar la clase Image. Además, Image.h no necesita reenviar la clase de Gráficos ya que #incluye el archivo que define esa clase (como debe).
Graphic.h:
class Graphic {
...
};
Image.h
:
#include "Graphic.h"
class Image : public Graphic {
...
};
Ya que Image amplía Graphic, elimine la inclusión de Image en su archivo Graphic.h.
Graphic.h
class Graphic {
...
};
Primero elimine esto, siempre debe tener la definición de clase completa disponible para heredar de una clase:
class Graphic;
Segundo, elimine todas las referencias a la imagen de Graphic.h. Por lo general, los padres no necesitan saber de sus hijos.