语法错误:标识符(错误C2061)

时间:2014-11-06 18:08:10

标签: c++

我讨厌发布一些如此微妙的东西,但这让我完全不知道我做错了什么: 当我编译时,它根本不喜欢类模拟器。我收到了错误

syntax error : identifier 'Simulator'

在模拟器的每个实例中我在DOCO头文件中使用。它也为我的Pellet结构做到了这一点。代码工作正常,直到我开始添加与DOCO.h中的Simulator类一起使用的函数。 Simulator类使用DOCO结构,DOCO结构使用类Simulator。那是问题吗?也许我使用了包括我的标题错误?

以下是我收到的错误的链接: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();
};

3 个答案:

答案 0 :(得分:0)

我确定你没有意思转发声明这些课程。

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

答案 1 :(得分:0)

Simulator.h文件中添加#include后,添加

struct DOCO;

Doco.h文件中添加#include后,添加

class Simulator;

这告诉你的编译器即使在编译模拟器文件时它还不知道DOCO是什么,它最终会弄明白。同样用于编译DOCO文件。

当您向前声明这样的类时,在定义类之前,您无法创建该类的任何实例。但是,您可以创建指向该类的指针或引用。因此,如果您的DOCO结构需要模拟器,反之亦然,请使它们包含指针成员而不是对象成员。

答案 2 :(得分:0)

正如我上面的评论所示,你的问题与递归包含有关。

你可以做以下两件事之一:

1)更改您的Simulator类,以便使用对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;放入头文件中。这在SO的许多主题中讨论了为什么你不应该在头文件中有这一行。