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’
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top