Pergunta

Estou tendo problemas de dependência. Eu tenho duas classes: Graphic e Image. Cada um tem a sua própria .cpp e .h. Estou declarando-os como o seguinte:

Graphic.h:


    #include "Image.h"
    class Image;
    class Graphic {
      ...
    };

Image.h:


    #include "Graphic.h"
    class Graphic;
    class Image : public Graphic {
      ...
    };

Quando tento compilar, obtenho o seguinte erro:

    Image.h:12: error: expected class-name before ‘{’ token

Se eu remover a declaração para a frente de Graphic de Image.h eu recebo o seguinte erro:

    Image.h:13: error: invalid use of incomplete type ‘struct Graphic’
    Image.h:10: error: forward declaration of ‘struct Graphic’
Foi útil?

Solução

Isso funcionou para mim:

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

Os seguintes compila o código sem erro:

#include "Graphic.h"

int main()
{
  return 0;
}

Outras dicas

Você não precisa incluir Image.h ou declarar frente Imagem em Graphic.h - que é uma dependência circular. Se Graphic.h depende de nada em Image.h é necessário dividir isso em um terceiro cabeçalho. (Se gráfico tem um membro de Imagem, que só não vai funcionar.)

Graphic.h não precisa incluir image.h, e ele não precisa de frente declarar a classe de imagem. Além disso, Image.h não precisa declarar frente a classe gráfica desde que você incluir o arquivo que define essa classe (como você deve).

Graphic.h:

class Graphic {
  ...
};

Image.h:

#include "Graphic.h"
class Image : public Graphic {
  ...
};

Uma vez que imagem se estende gráfico, retire a inclusão de imagens no seu arquivo Graphic.h.

Graphic.h

class Graphic {
  ...
};

Primeiro retire isso, você deve sempre ter a definição de classe completo disponível para herdar de uma classe:

class Graphic;

Em segundo lugar, remover todas as referências a Imagem de Graphic.h. O pai normalmente não precisa saber de seus criança.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top