2013-07-18 51 views
1

我對C++相當陌生,並且有一個惱人的bug:這個以前的函數代碼由於某種原因停止了工作。編譯後,我得到的第一個錯誤如下所示。我認爲,由於某些原因,即使它被導入,它仍不能識別枚舉類型MaterialEnum雖然被包含但未被識別

1>...\chunk.h(10): error C2146: syntax error : missing ';' before identifier 'terrain' 
1>...\chunk.h(10): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>...\chunk.h(10): error C2065: 'chunkWidth' : undeclared identifier 
1>...\chunk.h(10): error C2065: 'chunkWidth' : undeclared identifier 
1>...\chunk.h(10): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>...\world.h(14): error C2146: syntax error : missing ';' before identifier 'get' 
1>...\world.h(14): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>...\world.h(14): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>...\world.h(14): warning C4183: 'get': missing return type; assumed to be a member function returning 'int' 
1>...\world.h(6): error C2011: 'World' : 'class' type redefinition 
1>   ...\world.h(6) : see declaration of 'World' 
1>...\world.cpp(9): error C2027: use of undefined type 'World' 
1>   ...\world.h(6) : see declaration of 'World' 

Chunk.h

#pragma once 
#include "main.h" 

class Chunk { 
    private: 
     int xpos; 
     int ypos; 
    public: 
     Chunk(int xRelToSpawn, int yRelToSpawn); 
     Material terrain[chunkWidth][chunkWidth]; 
     int getXpos(); 
     int getYpos(); 
}; 

main.h

#pragma once 
#include "World.h" 

//const int gridSizeX = 30; 
//const int gridSizeY = 30; 
const int chunkWidth = 15; 
const int chunkHeight = 15; 
extern int viewportX; 
extern int viewportY; 
const int viewportWidth = 15; 
const int viewportHeight = 15; 

enum Material{SAND, WATER}; 

extern World world = World(); 

World.h

#include <vector> 
#include "main.h" 
#include "Chunk.h" 
using namespace std; 

class World { 
    private: 
     vector<Chunk> chunks; 
    public: 
     World(); 
     ~World(); 
     bool chunkExists(int x, int y); 
     //returns material for absolute coordinates 
     Material get(int x, int y); 
     //returns world coordinates for given chunk coordinates 
     int* getAbsCoords(int chunkIndex, int x, int y); 
     int* getChunkCoords(int x, int y); 
     Chunk getChunk(int index); 
     int getChunkIndex(int x, int y); 
     int chunkIndexAbove(int chunkIndex); 
     int chunkIndexBelow(int chunkIndex); 
     int chunkIndexLeft(int chunkIndex); 
     int chunkIndexRight(int chunkIndex); 
}; 

任何幫助表示讚賞。

+7

你確定你知道什麼是extern嗎? – Borgleader

+0

我可以向你保證,我並不完全瞭解'extern'的功能或用途。 – FracturedRetina

+2

我懷疑是World.h包含Chunk.h,所以你有循環包含。 – Puppy

回答

6

某處你有

#include "chunk.h" 

因此處理器停止該文件,並開始讀chunk.h代替:

#pragma once 
#include "main.h" 

因此處理器開始讀main.h代替:

#pragma once 
#include "World.h" 

因此,處理器開始讀取World.h:

#include <vector> 
#include "main.h" //main.h was pragma'd so this is ignored 
#include "Chunk.h" //chunk.h was pragma'd so this is ignored 
using namespace std; 

class World { 
    private: 
     vector<Chunk> chunks; //here, the compiler should be confused 
           //it hasn't seen what a "Chunk" is yet. 

您有循環依賴關係。解決這個問題的方法理論上很簡單,但在實踐中很棘手。第一:把所有的類型/全局/功能於一身的順序:

Material //material needs nothing else to be defined 
Chunk //chunk needs material, nothing else to be defined 
World //world needs Chunk _and_ material to be defined 
extern World world = World(); //needs World to be defined 

,這樣的數據是在這個順序然後編輯你的頭。即,包含Material的標題不應該包含包含塊,世界或world的標題。並且包含Chunk的標題不應包含標題,其中包含Worldworld

在你的情況下,類型沒有循環依賴關係,所以這相對容易。將Material移動到塊頭(或它自己的頭),以便塊頭不需要包含,並且不需要包含主頭。

Chunk.h //contains Material and Chunk 
World.h //contains World 
Main.h //contains extern World world 


我不認爲 extern World world = World()作品的標題。我認爲你必須刪除 = World(),然後在CPP文件,放線:

World world; 

這是實際的全局變量。頭文件中的extern僅讓所有其他文件知道此變量存在於某處。

1

避免圓形包括標準的做法是:

  • 如果您使用的是微軟的編譯器,在文件的開頭添加#pragma once
  • 要使用任何編譯器的工作,在.h文件的開頭:

    的#ifndef YOURFILENAME_H

    的#define YOURFILENAME_H

    的#include 「World.h」

    .. 。 體.h文件 的...

    #ENDIF // NDEF YOURFILENAME_H