Как вы наследуете от класса в другом заголовочном файле?

StackOverflow https://stackoverflow.com/questions/253284

  •  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. Родителю обычно не нужно знать своих детей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top