首先,让我告诉你,我是C ++的超级菜鸟。所以,对不起,如果我问一些愚蠢的事,但我完全陷入困境。
我正在尝试将我在AS3中编写的一个小游戏引擎移植到C ++中,并且我已经开始使用核心Game类。它必须存储级别,更新和管理它们,所以我认为指针是要走的路。
标题如下所示:
#pragma once
#include "Level.h"
class Game
{
public:
Level *level;
Level *nextLevel;
Game(void);
virtual ~Game(void);
virtual void begin();
virtual void onEveryFrame();
private:
void changeLevel();
};
编译器会为每个指针声明抛出两个错误:
错误1错误C2143:语法错误:缺少';'在'*'之前
错误2错误C4430:缺少类型说明符 - 假定为int。注意:C ++ 不支持default-int
那么,我做错了什么?错误描述对我来说看起来不太具描述性。
(我正在使用VS Express 2012)
编辑:
对不起伙计们!看起来像是一个循环依赖问题。实际上与指针无关。
“Level.h”是这样的:
#pragma once
#include "Game.h"
class Level
{
public:
Game *game;
Level(void);
virtual ~Level(void);
virtual void begin();
virtual void onEveryFrame();
};
对不起伙计们,noob错误。 :(
答案 0 :(得分:4)
Level.h
肯定会声明Level
类型(最可能是类),但它有一些问题会阻止声明Level
类型。检查或发布此处。Game.h
标题实际上不需要了解Level
类型的详细信息。如果您的Level.h
标题应该声明为Level
,那么您就可以在class Level;
标题中声明Game.h
。这足以使用指针。当然,如果您尝试操作Level
类型的对象,则需要查看其界面。所以你肯定需要Level.h
包含在实现Game
类的模块中。 <强>更新强>:
我注意到你的编辑,循环依赖与我在[2]中提到的声明完全一致。此外,它们降低了项目垃圾并增加了复杂性。这是C / C ++中广泛使用的技术(在C中它通常是struct或类似的东西)。我们的想法是在不需要实际对象大小或详细界面的地方声明'它是类型'。
答案 1 :(得分:2)
你有一个循环依赖,所以当你编译器还没有关于什么类型“Level”或“Game”的任何信息时,你包含两个类中的一个的哪个头文件将需要另一个的前向声明将会是。
解决方案是一个简单的前向移动。
#pragma once
#include "Level.h"
class Level;
class Game
{
public:
Level *level;
Level *nextLevel;
Game(void);
virtual ~Game(void);
virtual void begin();
virtual void onEveryFrame();
private:
void changeLevel();
};
并在Level标题中执行Game的倒数前向声明。
答案 2 :(得分:0)
您的编译器无法识别类型Level
。可能是包含/拼写错误?