Как вы наследуете от класса в другом заголовочном файле? - PullRequest
4 голосов
/ 31 октября 2008

У меня проблемы с зависимостью. У меня есть два класса: 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’

Ответы [ 5 ]

10 голосов
/ 31 октября 2008

Это сработало для меня:

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

Следующий код компилируется без ошибок:

#include "Graphic.h"

int main()
{
  return 0;
}
5 голосов
/ 31 октября 2008

Вам не нужно включать Image.h или пересылать объявление Image в Graphic.h - это круговая зависимость. Если Graphic.h зависит от чего-либо в Image.h, вам нужно разделить это на третий заголовок. (Если в Graphic есть элемент Image, это просто не сработает.)

4 голосов
/ 31 октября 2008

Graphic.h не должен включать image.h, и ему не нужно заранее объявлять класс Image. Кроме того, Image.h не нужно заранее объявлять класс Graphic, поскольку вы #include файл, который определяет этот класс (как вам нужно).

Graphic.h:

class Graphic {
  ...
};

Image.h

#include "Graphic.h"
class Image : public Graphic {
  ...
};
1 голос
/ 31 октября 2008

Поскольку Image расширяет Graphic, удалите включение Image в свой файл Graphic.h.

Graphic.h

class Graphic {
  ...
};
0 голосов
/ 31 октября 2008

Сначала удалите это, вы всегда должны иметь полное определение класса, доступное для наследования от класса:

class Graphic;

Во-вторых, удалите все ссылки на изображение из Graphic.h. Родителю обычно не нужно знать своих детей.

...