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

时间:2010-06-16 13:39:12

标签: c++ c visual-studio visual-studio-2008 visual-c++

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

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标题。我假设把它们全部包含在这份文件中。它们都相互链接,好像它们都在同一个文档中。如果我错了,请纠正我,因为这是一个视图标题。继续......

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()
{

}

不知道最近发生了什么。我认为我如何链接文件,我不确定。

3 个答案:

答案 0 :(得分:4)

问题是你需要在{GXGL.h和GXDX.h'的顶部都有#include "GXRenderer.h"

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

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

编辑:关于您的班级类型重新定义:

在每个标题文件的顶部,您应该有#pragma once

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

答案 1 :(得分: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看起来完全不同。

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

答案 2 :(得分:1)

我收到错误C2504:'CView':基类未定义 其中CView不是我继承的基类。

我正在从MScrollView中获取mYClass,“对于这个问题,任何不是实际基类的类都是这里要注意的重点” 但错误是C2504。当我将它包含在出现此问题的标题中时,此问题已得到解决。

#include "stdafx.h"

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