0

我正在使用 cocos2d 框架开发 iPhone 游戏,最近遇到了一个我似乎无法解决的问题。在我的项目中添加了一个新类并在其中做了一些工作之后,我尝试编译我的代码,而我什至没有接触过的几个类都坏了。似乎这些类只是忘记了如何导入外部类。我在我的几个课程中都遇到了错误,但这里有一个例子:

#import "cocos2d.h"
#import "XZombie.h"
#import "WayPoint.h"
#import "XBuilding.h"

//@class XBuilding;

@interface Hoarde : CCNode
{
    float _spawnRate;
    int _totalXombies;
    NSMutableArray *_path;
    XBuilding *_target;
    NSMutableArray *_zombies;
    bool _zombiesReset;
}

@property (nonatomic) float spawnRate;
@property (nonatomic) int totalXombies;
@property (nonatomic, retain) NSMutableArray *path;
@property (nonatomic, retain) XBuilding *target;
@property (nonatomic, retain) NSMutableArray *zombies;
@property (nonatomic, assign) bool zombiesReset;

- (id) initWithZombieCount:(int)totalXombies Target:(XBuilding *) target SpawnRate:(float)spawnrate;
- (void) resetZombies;

@end

我在“XBuilding *_target;
如果我取消注释”的行上得到错误@class XBuilding;,错误就会消失,所以虽然这并不能真正解决我的问题,但它给了我一个解决它的工具。


如果我@class对所有我遇到问题的文件都做了这个技巧,我可以解决这个问题。问题是,除了说明符限定符列表错误之外,我还遇到了一个新的但类似的错误。一些代码行给了我Expected a ')' before *tokenExpected a ';' before *token. 这些行通常也会给我前面的错误,所以@class 技巧也很有效,但我一点也不知道为什么这些东西正在做它正在做的事情。我在某处(我认为是 cocos2d 论坛)读到将 .m 文件重命名为 .mm 可能会奏效,但对我来说不是。

所以,虽然我可以继续我的项目,但我真的很想知道将来如何避免类似的事情发生……

4

1 回答 1

1

请检查是否存在循环依赖,例如导入ClassB.hClassA.h反之亦然。这是发生“预期的说明符限定符列表之前...”错误的典型场景。

我建议只@class在你的头文件中使用,除了:

  • #import超类
  • #import你的类实现的协议

头文件应该#import在你的实现文件中编辑。

“Objective-C 编程语言”说:

@class指令最大限度地减少了编译器和链接器看到的代码量,因此是给出类名前向声明的最简单方法。简单来说,它避免了在导入文件时可能会出现的潜在问题,而这些文件又会导入其他文件。例如,如果一个类声明了另一个类的静态类型实例变量,并且它们的两个接口文件相互导入,则任何一个类都无法正确编译。

更多参考:

于 2012-04-27T01:52:44.820 回答