Come si eredita da una classe in un diverso file di intestazione?
-
05-07-2019 - |
Domanda
Sto riscontrando problemi di dipendenza. Ho due classi: Graphic
e Image
. Ognuno ha i propri file .cpp e .h. Li sto dichiarando come segue:
Graphic.h
:
#include "Image.h"
class Image;
class Graphic {
...
};
image.h
:
#include "Graphic.h"
class Graphic;
class Image : public Graphic {
...
};
Quando provo a compilare, ottengo il seguente errore:
Image.h:12: error: expected class-name before ‘{’ token
Se rimuovo la dichiarazione in avanti di Graphic
da Image.h
visualizzo il seguente errore:
Image.h:13: error: invalid use of incomplete type ‘struct Graphic’ Image.h:10: error: forward declaration of ‘struct Graphic’
Soluzione
Questo ha funzionato per me:
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
Il seguente codice viene compilato senza errori:
#include "Graphic.h"
int main()
{
return 0;
}
Altri suggerimenti
Non è necessario includere Image.h o dichiarare in avanti Image in Graphic.h - questa è una dipendenza circolare. Se Graphic.h dipende da qualcosa in Image.h, è necessario suddividerlo in una terza intestazione. (Se Graphic ha un membro Image, questo non funzionerà.)
Graphic.h non ha bisogno di includere image.h e non ha bisogno di dichiarare in avanti la classe Image. Inoltre, Image.h non ha bisogno di inoltrare la classe Graphic poiché # include il file che definisce quella classe (come è necessario).
Graphic.h:
class Graphic {
...
};
image.h
:
#include "Graphic.h"
class Image : public Graphic {
...
};
Poiché l'immagine estende Graphic, rimuovi l'inclusione di Image nel tuo file Graphic.h.
Graphic.h
class Graphic {
...
};
Per prima cosa rimuovilo, devi sempre avere la definizione di classe completa disponibile per ereditare da una classe:
class Graphic;
In secondo luogo, rimuovere tutti i riferimenti a Image da Graphic.h. Il genitore di solito non avrà bisogno di conoscere i suoi figli.