我检查了一个与此类似的帖子,但链接不同,问题从未得到解决。我的问题是,由于某种原因链接器期望有基类的定义,但基类只是一个接口。以下是整个错误
c:\users\numerical25\desktop\intro todirectx\godfiles\gxrendermanager\gxrendermanager\gxrendermanager\gxdx.h(2) : error C2504: 'GXRenderer' : base class undefined
以下是显示标题如何相互链接的代码
#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标题。我假设把它们全部包含在这份文件中。它们都相互链接,好像它们都在同一个文档中。如果我错了,请纠正我,因为这是一个视图标题。继续......
class GXRenderer {
public:
virtual void Render() = 0;
virtual void StartUp() = 0;
};
class GXGL: public GXRenderer {
public:
void Render();
void StartUp();
};
class GXDX: public GXRenderer {
public:
void Render();
void StartUp();
};
#include "GXGL.h"
void GXGL::Render()
{
}
void GXGL::StartUp()
{
}
//...Next document
#include "GXDX.h"
void GXDX::Render()
{
}
void GXDX::StartUp()
{
}
不知道最近发生了什么。我认为我如何链接文件,我不确定。
答案 0 :(得分:4)
问题是你需要在{GXGL.h和GXDX.h'的顶部都有#include "GXRenderer.h"
。
必须定义基类型,而不是在定义派生类型之前声明。
顺便说一句,错误是编译错误而不是链接错误。
编辑:关于您的班级类型重新定义:
在每个标题文件的顶部,您应该有#pragma once
。
#pragma once
指令指定编译器在构建中最多包含一次该文件。
答案 1 :(得分:2)
您将它们全部包含在GXRenderManager.h
中,这意味着GXRenderManager.h
可以。
但您忘了将它们全部包含在GXGL.cpp
和GXDX.cpp
中。在这些.cpp文件中GXRenderer
类是完全未知的。
#include
策略中至少有两所“学校”。有人说头文件必须包含自己编译所需的一切。这意味着GXGL.h
和GXDX.h
必须包含GXRenderer.h
。如果您遵循该策略,那么您的GXGL.cpp
和GXDX.cpp
就会好起来。
另一个“学校”说头文件根本不能相互包含,即所有内容必须通过.cpp文件完成。乍一看,你可以猜到你的GXGL.h
和GXDX.h
会遵循这个策略(因为你没有在其中加入任何内容),但是你的GXRenderManager.h
看起来完全不同。
您需要决定要尝试遵循的策略并遵循它。我推荐第一个。
答案 2 :(得分:1)
我收到错误C2504:'CView':基类未定义 其中CView不是我继承的基类。
我正在从MScrollView中获取mYClass,“对于这个问题,任何不是实际基类的类都是这里要注意的重点” 但错误是C2504。当我将它包含在出现此问题的标题中时,此问题已得到解决。
#include "stdafx.h"
其中stdafx.h有#include,其中包含所有定义的基本类...希望这个答案能解决所有面临此问题的人。