2014-11-06 312 views
0

我討厭發佈如此微妙的東西,但是這讓我完全難住我做錯了什麼: 當我編譯時,根本不喜歡類模擬器。我得到錯誤語法錯誤:標識符(錯誤C2061)

syntax error : identifier 'Simulator' 

在模擬器的每個實例我在DOCO頭文件中使用。它也爲我的Pellet結構做到了這一點。代碼工作得很好,直到我開始添加與DOCO.h中的Simulator類一起使用的函數。 模擬器類使用DOCO結構,DOCO結構使用類模擬器。那是問題嗎?也許我用包括我的頭錯了?

這裏是一個錯誤的鏈接,我得到它是否有助於:http://msdn.microsoft.com/en-us/library/yha416c7.aspx

#include <iostream> 
#include <conio.h> 
#include <string> 
#include "Simulator.h" //<---Has a chain of includes for other header files 
int main() 
{ 
    RandomNumberGen R; 
    Simulator S; 
    Pellet P; 
    DOCO D; 

    system("pause"); 
    return 0; 
} 

頭文件: Simulator.h

#pragma once 
#include <iostream> 
#include <stdio.h> 
//#include <conio.h> 
#include <vector> 
#include "Pellet.h" 
#include "DataParser.h" 
#include "DOCO.h" 
#include "RandomNumberGen.h" 
#include "Cell.h" 
#include "Timer.h" 

using namespace std; 

class Simulator 
{ 
private: 
    int s_iDocoTotal; 
    int s_iPelletTotal; 
    int s_iGridXComponent; 
    int s_iGridYComponent; 
    int tempX; 
    int tempY; 

    //Pellet P; 
    //DOCO D; 


    static const unsigned int s_iNumOfDir=8; 


public: 
    Simulator(); 
    ~Simulator(); 

    //int GenerateDirection(); 
    void InitiateDOCO(RandomNumberGen *R, DOCO *D, vector<DOCO>&); // 
    void SpreadFood(RandomNumberGen *R, Pellet *P, vector<Pellet>&, const int x, const int y);  // 
    void AddPellet(Pellet *P, RandomNumberGen *R);   // 
    void CheckClipping(Pellet *P, RandomNumberGen *R);  // 
    void CheckPellets(Pellet *P, RandomNumberGen *R);  // 
    void CreateGrid(int x, int y);// 
    int GetGridXComponent(); // 
    int GetGridYComponent(); // 
    int GetDocoTotal(); 
    vector<DOCO> docoList;     //Holds the Doco coordinates 
    vector<Pellet> pelletList;    //!!Dont use this!! For data import only 
    vector<vector<int> > pelletGrid; //Holds X-Y and pellet count 
    char **dataGrid;  //Actual array that shows where units are 

    Simulator(const int x, const int y) : 
       s_iGridXComponent(x), 
       s_iGridYComponent(y), 
       pelletGrid(x, vector<int>(y)){} 
}; 

DOCO.h

#pragma once 
#include <iostream> 
#include <stdio.h> 
#include <vector> 
#include "Simulator.h" 
//#include "DataParser.h" 



using namespace std; 

struct DOCO 
{ 
private: 
    int d_iXLocation; 
    int d_iYLocation; 
    int d_iEnergy; 
    int d_iMovement; 
    int d_iTemp; 
    //Simulator S; 
    //RandomNumberGen R; 
    //Pellet P; 
    enum Direction { NORTH, SOUTH, EAST, WEST, NORTHWEST, NORTHEAST, SOUTHWEST, SOUTHEAST}; 


public: 
    DOCO(); 
    ~DOCO(); 
    //int a is the position in docoList to reference DOCO 
    int GoNorth(Simulator *S, int a); 
    int GoSouth(Simulator *S, int a); 
    int GoEast(Simulator *S, int a); 
    int GoWest(Simulator *S, int a); 
    int GoNorthWest(Simulator *S, int a); 
    int GoNorthEast(Simulator *S, int a); 
    int GoSouthWest(Simulator *S, int a); 
    int GoSouthEast(Simulator *S, int a); 

    //int a is the position in docoList to reference DOCO 
    void Sniff(Simulator *S, RandomNumberGen *R, int a);  //Detects DOCOs and food 
    void Reroute(Simulator *S, RandomNumberGen *R, int a); //Changes DOCO direction 
    void SetDOCO(int tempX, int tempY, int tempEnergy, int tempMovement); 
    int GetEnergy(); // 
    int SetEnergy(); 
    int SetMovement(); 
    int GetMovement(); // 
    int GetXLocation(); // 
    int GetYLocation(); // 
    void SetXLocation(int d_iTemp); 
    void SetYLocation(int d_iTemp); 
    void EatPellet(Pellet *P, Simulator *S, int a);//ADD DOCO ARGUMENT/DONT OVERLAP DOCO AND PELLETS 
    void MoveDoco(Simulator *S, int a); 
    void Death(); 
}; 
+0

你是否在main.cpp中包含這些頭文件? – radar 2014-11-06 18:16:55

+0

運行和複製很好,你是怎麼做到的? – Surt 2014-11-06 18:18:12

+0

我看到一個沒有'#include'的main()函數。所以,當你像這樣引入諸如「Simulator」之類的東西時,編譯器當然會抱怨。另外,創建實例時不需要重複'class'和'struct'關鍵字。 – PaulMcKenzie 2014-11-06 18:19:34

回答

0

正如我上面的評論建議,你的問題與遞歸包含有關。

你可以做兩件事情之一:

1)改變你的模擬類,讓你使用引用DOCO或指針DOCO,從而forward declare DOCO。

2)更改您的DOCO標題以使用指向模擬器的指針或對模擬器的引用,然後僅轉發聲明Simulator

最簡單的一個改變(如果在你的代碼的意見仍然)是改變DOCO.h

#pragma once 
#include <iostream> 
#include <stdio.h> 
#include <vector> 

class Simulator; 

struct DOCO 
{ 
... 
}; 

裏面DOCO結構定義的,你可以指定引用和指針Simulator,而不是模擬的對象。

我也建議不是using namespace std;放在頭文件中。這在這裏的許多線程中討論,爲什麼你不應該在你的頭文件中有這樣的行。

+0

'使用名稱空間標準;'在標題是邪惡的,好點。 – Surt 2014-11-06 19:25:53

0

我我確定你不是故意宣佈這些課程。

int main() 
 
{ 
 
\t RandomNumberGen R; 
 
\t Simulator S; 
 
\t Pellet P; 
 
\t DOCO D; 
 
    
 
    system("pause"); 
 
\t return 0; 
 
}

+0

給定一個可見的類「RandomNumberGen」,將類型稱爲「類RandomNumberGen」是完全合法的。問題是(假設這是整個源文件)類名不可見。刪除'class'和'struct'關鍵字只會改變錯誤信息。 – 2014-11-06 18:21:01

+0

即使刪除main()中的關鍵字struct和class,我也有錯誤。就可見性而言,其他源文件在使用時指向結構(或類)。例如:void CheckClipping(Pellet * P,RandomNumberGen * R); – AbductedMonkey 2014-11-06 18:35:22

+0

@AduductedMonkey正如我上面的評論所建議的,你的問題與遞歸包含有關。您需要更改您的Simulator類,以便使用對DOCO的引用或指向DOCO的指針,從而「forward declare」DOCO。 – PaulMcKenzie 2014-11-06 18:42:29

0

Simulator.h文件您的#includes後,添加行

struct DOCO; 

Doco.h文件#包括後,添加行

class Simulator; 

這告訴你的c ompiler即使在編譯模擬器文件時也不知道DOCO是什麼,它最終弄清楚了。同樣用於編譯DOCO文件。

當您像這樣前向聲明一個類時,在定義該類之前,您無法創建該類的任何實例。但是,您可以創建指向該類的指針或引用。所以如果你的DOCO結構需要有一個模擬器,反之亦然,使它們包含指針成員而不是對象成員。

相關問題