Как вы наследуете от класса в другом заголовочном файле?
-
05-07-2019 - |
Вопрос
У меня проблемы с зависимостью.У меня есть два занятия: Graphic
и Image
.У каждого из них есть свои собственные файлы .cpp и .h.Я объявляю их следующими:
Graphic.h
:
#include "Image.h"
class Image;
class Graphic {
...
};
Image.h
:
#include "Graphic.h"
class Graphic;
class Image : public Graphic {
...
};
Когда я пытаюсь скомпилировать, я получаю следующую ошибку:
Image.h:12: error: expected class-name before ‘{’ token
Если я удалю прямое объявление о Graphic
От Image.h
Я получаю следующую ошибку:
Image.h:13: error: invalid use of incomplete type ‘struct Graphic’ Image.h:10: error: forward declaration of ‘struct Graphic’
Решение
У меня это сработало:
Изображение.h:
#ifndef IMAGE_H
#define IMAGE_H
#include "Graphic.h"
class Image : public Graphic {
};
#endif
Графический.h:
#ifndef GRAPHIC_H
#define GRAPHIC_H
#include "Image.h"
class Graphic {
};
#endif
Следующий код компилируется без ошибок:
#include "Graphic.h"
int main()
{
return 0;
}
Другие советы
Вам не нужно включать Image.h или пересылать объявление Image в Graphic.h - это круговая зависимость. Если Graphic.h зависит от чего-либо в Image.h, вам нужно разделить это на третий заголовок. (Если в Graphic есть элемент Image, это просто не сработает.)
Graphic.h не должен включать image.h, и ему не нужно заранее объявлять класс Image. Кроме того, Image.h не нужно заранее объявлять класс Graphic, поскольку вы #include файл, который определяет этот класс (как вы должны).
<код> Graphic.h: код>
class Graphic {
...
};
<код> Image.h код>:
#include "Graphic.h"
class Image : public Graphic {
...
};
Поскольку Image расширяет Graphic, удалите включение Image в свой файл Graphic.h.
<код> Graphic.h код>
class Graphic {
...
};
Сначала удалите это, вы всегда должны иметь полное определение класса, доступное для наследования от класса:
class Graphic;
Во-вторых, удалите все ссылки на изображение из Graphic.h. Родителю обычно не нужно знать своих детей.