【问题标题】:How do you inherit from a class in a different header file?如何从不同头文件中的类继承?
【发布时间】:2010-09-20 04:15:56
【问题描述】:

我遇到了依赖问题。我有两个课程:GraphicImage。每个都有自己的 .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:错误:“{”标记之前的预期类名

如果我从Image.h 中删除Graphic 的前向声明,则会收到以下错误:

Image.h:13:错误:不完整类型“struct Graphic”的使用无效 Image.h:10:错误:“结构图形”的前向声明

【问题讨论】:

  • 就目前而言,这应该可以工作。你用的是什么编译器? Image.h 和 Graphic.h 是否都在文件系统的同一个文件夹中?你的编译器知道在哪里寻找它们吗?
  • 请不要把问题编辑得这么糟糕:它会使所有这些有价值的答案无效。而是自己提供一个答案,以保持时间线完整。
  • 我无法提供答案,因为我不知道答案是什么 - 相反,我更改了问题,以便更清楚我想问什么(建议的更改没有帮助) .
  • 我通过检查每个相关源文件并询问自己需要哪些包含和声明以及不需要哪些内容来修复它,然后删除不需要的内容。然后它编译得很好。不确定问题是什么,因为我无法重现该缺陷(它与单独的文件有关)。
  • (回滚到第一版)

标签: c++ inheritance organization


【解决方案1】:

这对我有用:

图像.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;
}

【讨论】:

    【解决方案2】:

    Graphic.h 不需要包含 image.h,也不需要转发声明 Image 类。此外,Image.h 不需要转发声明 Graphic 类,因为您 #include 定义该类的文件(您必须这样做)。

    Graphic.h:

    class Graphic {
      ...
    };
    

    Image.h:

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

    【讨论】:

      【解决方案3】:

      您不需要在 Graphic.h 中包含 Image.h 或转发声明 Image - 这是一个循环依赖。如果 Graphic.h 依赖于 Image.h 中的任何内容,则需要将其拆分为第三个标头。 (如果 Graphic 有一个 Image 成员,那就行不通了。)

      【讨论】:

      • Graphic.h 是如何依赖 Image.h 的?
      【解决方案4】:

      首先删除它,您必须始终拥有完整的类定义才能从类继承:

      class Graphic;
      

      其次,从 Graphic.h 中删除所有对 Image 的引用。父母通常不需要知道它的孩子。

      【讨论】:

      • 我尝试删除前向声明,如问题中所述。
      【解决方案5】:

      由于 Image 扩展了 Graphic,因此请删除 Graphic.h 文件中包含的 Image。

      Graphic.h

      class Graphic {
        ...
      };
      

      【讨论】:

      • 同时添加标题保护,那么你就有了最好的解决方案。
      猜你喜欢
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 2021-05-28
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      相关资源
      最近更新 更多