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’
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top