2014-11-06 310 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结构需要有一个模拟器,反之亦然,使它们包含指针成员而不是对象成员。

相关问题