Como você herdar de uma classe em um arquivo de cabeçalho diferente?
-
05-07-2019 - |
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’
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.