【问题标题】:quick help needed base class undefined需要快速帮助的基类未定义
【发布时间】:2015-08-29 21:59:36
【问题描述】:

无法在任何地方找到解决方案

这是我的文件布局

SDK.h

#pragma once
#include "Object.h"
#include "Panel.h"

对象.H

#pragma once
#include "SDK.h"

class BaseObject
{
etc...
}

面板.h

#pragma once
#include "SDK.h"

class Panel : public BaseObject
{
etc...
}

然后是错误

Panel.h(5): error C2504: 'BaseObject' : base class undefined

有人可以告诉我如何正确地做到这一点吗?这可能是一个非常简单的修复:(

编辑:我看了但无法解决,我是否必须创建一个新文件并将它们包含在 .CPP 文件中?

【问题讨论】:

  • 代码中的类定义后是否有分号?此外,您还遇到了 SDK.h 和 Object.h 的循环包含依赖项。
  • Circular C++ Header Includes 的可能重复项
  • 是的,但还是解决不了
  • @LogicStuff #pragma once 防止多重/循环包含
  • 是的,对所有头文件也这样做了

标签: c++ class include public


【解决方案1】:

您没有包含有关翻译单元无法编译代码的任何信息。因此,我在推测。我的猜测是你有一些东西,包括Object.h first:

  • 编译器开始包含 Object.h 并将其标记为不再包含
  • 编译器包含SDK.h,暂停包含Object.h并将其标记为不再包含
  • 跳过包含Object.h
  • 编译器包含Panel.h,暂停包含SDK.h并将其标记为不再包含
  • 跳过包含SDK.h
  • 已达到Panel 的定义,但尚未定义BaseObject,会出现错误

解决方法是不包括来自Object.hPanel.hSDK.h。相反,Panel.h 应该包含 Object.h,并且两个标题都应该包含它们需要的任何其他内容。

【讨论】:

  • 我明白了,但是如果我想像 Button.h 这样添加,那我该怎么办?
  • @jacobharris:您将包含定义其直接基类的标头以及需要声明的所有内容的标头。如果您想为库的用户提供方便的标头,您也可以在其中包含新创建的标头。
【解决方案2】:
  • 从 Object.h 中删除 #include "SDK.H"

  • [万不得已]如果问题仍然没有解决,请使用header guards,这里是tutorial

【讨论】:

  • 你真的检查过这个吗?如果是这样,你能解释一下,为什么这有帮助吗?
  • 简单基类声明不止一次,所以删除它。我知道 pragma 在那里,但在这种特殊情况下它不起作用。
  • 虽然我猜你的建议可能会奏效,但我很确定,解释是错误的,因为 a) 会产生不同的编译器错误,b) 意味着编译器不会处理 @ 987654324@ 正确,我认为这不太可能。
猜你喜欢
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多