Visual Studio提供引用类的临时错误(C ++)

时间:2015-09-03 15:10:49

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

我在引用另一个文件中的类对象时遇到了麻烦。我有一个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。

感谢。

2 个答案:

答案 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.hMainMap.h引用了D3DGraphicsFileSystem,但未引用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;