我讨厌发布一些如此微妙的东西,但这让我完全不知道我做错了什么: 当我编译时,它根本不喜欢类模拟器。我收到了错误
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();
};
答案 0 :(得分:0)
我确定你没有意思转发声明这些课程。
int main()
{
RandomNumberGen R;
Simulator S;
Pellet P;
DOCO D;
system("pause");
return 0;
}
&#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的许多主题中讨论了为什么你不应该在头文件中有这一行。