我在引用另一个文件中的类对象时遇到了麻烦。我有一个Main类,它做的东西,另一个类叫做MainMap,它做了不同的东西。它们看起来像这样:
Main.h
#pragma once
#include "D3DGraphics.h"
#include "Filesystem.h"
#include "MainMap.h"
class Main
{
private:
void DoStuff();
int step = 0;
D3DGraphics gfx;
FileSystem fs;
MainMap * mainmap;
public:
Main(HWND hWnd);
void Go();
};
Main.cpp的
#include "Main.h"
Main::Main(HWND hWnd):
gfx(hWnd)
{
mainmap = new MainMap(gfx, fs);
}
void Main::Go()
{
gfx.BeginFrame();
DoStuff();
gfx.EndFrame();
}
void Main::DoStuff()
{
mainmap->MainStage(gfx);
}
MainMap.h
#pragma once
#include "Main.h"
class MainMap
{
public:
MainMap(D3DGraphics& gfx, FileSystem& fs);
void MainStage(D3DGraphics& gfx);
private:
void Render(D3DGraphics& gfx);
int landtype[256][256] = {};
int landtypenew[256][256] = {};
};
MainMap.cpp
#include "MainMap.h"
MainMap::MainMap(D3DGraphics & gfx, FileSystem & fs)
{
for (int mapx = 0; mapx < 256; ++mapx)
{
for (int mapy = 0; mapy < 256; ++mapy)
{
landtype[mapx][mapy] = (int(rand() % 5) + 1);
if (rand() % 100 < 75) landtype[mapx][mapy] = 5;
}
}
}
void MainMap::MainStage(D3DGraphics & gfx)
{
//does stuff
Render(gfx);
}
void MainMap::Render(D3DGraphics& gfx)
{
//renders stuff
}
现在问题似乎似乎与任何编码无关。我可以完美地运行程序,它可以正常工作。但是,如果我更改MainMap.cpp中的任何代码,它会抛出三个错误:
missing type specifier - int assumed. Note C++ does not support default-int
syntax error: missing ';' before '*'
unexpected token(s) preceding ';'
全部来自Main.h中的第13行,即
MainMap * mainmap;
但是如果我将这一行与Main.cpp中引用mainmap的两行一起注释掉,编译程序,然后删除注释并运行它就可以了(并且所有代码完全相同)
每次我想要对MainMap.cpp文件进行更改时,我都会感到很累,有人可以告诉我,我做了什么以及它是如何做错的修好了?如果你需要知道我使用的是Visual Studio 2015。
感谢。
答案 0 :(得分:0)
编译MainMap.cpp
时,它包含MainMap.h
,其中包含Main.h
。当Main.h
再次包含MainMap.h
时,由于#pragma once
告诉编译器每个编译单元只包含一次此文件,因此将其遗漏。因此,在Main.h
中,类型MainMap
未知。
除了在MainMap.h
中包含Main.h
之外,您可以直接声明该类,因为您只使用指向它的指针:
// in Main.h
#pragma once
#include "D3DGraphics.h"
#include "Filesystem.h"
//#include "MainMap.h"
class MainMap;
编辑:
除了上述更改之外,您还不需要在Main.h
中加入MainMap.h
。 MainMap.h
引用了D3DGraphics
和FileSystem
,但未引用Main
,因此只需包含这些文件:
// in MainMap.h
#pragma once
//#include "Main.h"
#include "D3DGraphics.h"
#include "Filesystem.h"
答案 1 :(得分:0)
您的头文件Main.h和MainMap.h相互引用。它们都应该以对另一个类的不完整定义开始,即class Main; class MainMap;