错误 C2504:'BASECLASS':基类未定义

Posted

技术标签:

【中文标题】错误 C2504:\'BASECLASS\':基类未定义【英文标题】:error C2504: 'BASECLASS' : base class undefined错误 C2504:'BASECLASS':基类未定义 【发布时间】:2010-06-16 13:39:11 【问题描述】:

我查看了与此类似的帖子,但链接不同,问题从未解决。我的问题是,由于某种原因,链接器期望有一个基类的定义,但基类只是一个接口。以下是全部错误

c:\users\numerical25\desktop\intro todirectx\godfiles\gxrendermanager\gxrendermanager\gxrendermanager\gxdx.h(2) : error C2504: 'GXRenderer' : base class undefined

下面是显示标题如何相互链接的代码

GXRenderManager.h

#ifndef GXRM
#define GXRM
#include <windows.h>
#include "GXRenderer.h"
#include "GXDX.h"
#include "GXGL.h"

enum GXDEVICE 
    DIRECTX,
    OPENGL
;

class GXRenderManager 
public:
    static int Ignite(GXDEVICE);

private:
    static GXRenderer *renderDevice;

;

#endif

在 GxRenderManager 的顶部,有 GXRenderer、windows、GXDX、GXGL headers。我假设将它们全部包含在本文档中。它们都相互链接,就好像它们都在同一个文档中一样。如果我错了,请纠正我,因为这就是视图标题的方式。继续……

GXRenderer.h

class GXRenderer 

public:
    virtual void Render() = 0;
    virtual void StartUp() = 0;

;

GXGL.h

class GXGL: public GXRenderer 

public:
    void Render();
    void StartUp();
;

GXDX.h

class GXDX: public GXRenderer 
public:
    void Render();
    void StartUp();
;

GXGL.cpp 和 GXDX.cpp 分别

#include "GXGL.h"

void GXGL::Render()




void GXGL::StartUp()




//...Next document

#include "GXDX.h"


void GXDX::Render()




void GXDX::StartUp()



不知道发生了什么。我认为这是我如何链接文档,我不确定。

【问题讨论】:

【参考方案1】:

问题是您需要在两个顶部都有#include "GXRenderer.h":GXGL.h 和 GXDX.h。

必须定义基类型,而不仅仅是在定义派生类型之前声明。

顺便说一下,错误是编译错误而不是链接错误。

编辑:关于你的类类型重新定义:

在每个头文件的顶部你应该有#pragma once

#pragma once 指令指定编译器在构建中最多包含一次文件。

【讨论】:

我试过了,我得到“错误 C2011: 'GXRenderer' : 'class' 类型重新定义” 我想我看错了,但我想通过在 1 个文档中包含所有标题(GXRenderManager.h ) 他们都会以这种方式相互链接 @numerical25:每个 cpp 都被编译成单独的对象,然后链接在一起,这就是为什么你不能像你想的那样将项目中的所有内容都包含在一个文件中。 所以一个标题与另一个标题链接。我必须直接将包含在其中之一。书籍说编译器将所有头文件声明放在实现包含的确切位置,就好像它们在同一个文档中一样。我想如果计算机这样读取,一个标题会识别另一个标题并通过并排包含 2 个标题来相互链接。但我想不会。无论如何,这确实解决了问题。谢谢【参考方案2】:

您将它们全部包含在GXRenderManager.h 中,这意味着GXRenderManager.h 可以。

但是您忘记将它们全部包含在GXGL.cppGXDX.cpp 中。在这些 .cpp 文件中,GXRenderer 类是完全未知的。

#include 策略至少有两个“学校”。有人说头文件必须包含自己编译所需的所有内容。这意味着GXGL.hGXDX.h 必须包含GXRenderer.h。如果您遵循该策略,您的GXGL.cppGXDX.cpp 会像现在一样正常。

另一个“学校”说头文件根本不能相互包含,即所有包含都必须通过 .cpp 文件完成。乍一看,您可能会猜到您的 GXGL.hGXDX.h 遵循该策略(因为您没有在其中包含任何内容),但您的 GXRenderManager.h 看起来完全不同。

您需要决定您要遵循的策略并遵循它。我会推荐第一个。

【讨论】:

也许我不完全理解标题。很久以前,我陷入了一种情况,即标题无法识别,因为它们已经包含在其他地方。我仍然无法完全理解为什么我会遇到这个问题。我试图找到解决这个问题的来源,但找不到。尽管如此,我有时还是会感到困惑,并认为在多个文档中包含一个标题会导致其中一个忽略它,因为一个标题只能被调用一次。或者有人告诉我。【参考方案3】:

我收到一个错误 C2504: 'CView' : base class undefined 其中 CView 不是我继承的直接基类。

我从 MScrollView 继承 mYClass,“就此而言,任何不是实际基类的类都是此处要注意的重点” 但错误是C2504。当我将它包含在出现此问题的标题中时,此问题就解决了。

#include "stdafx.h"

其中 stdafx.h 有 #include ,其中包含定义的所有基本类...希望这个答案可以解决所有面临此问题的人。

【讨论】:

以上是关于错误 C2504:'BASECLASS':基类未定义的主要内容,如果未能解决你的问题,请参考以下文章

带有前向声明的循环包含和继承导致 C2504 基类未定义

error C2504: 未定义基类

Qt - moc 导致 C2504:基类未定义

EF6 - BaseClass数据复制

错误 C2504 循环包含

是否扩展接口,何时基类已经扩展了相同的接口