2012-03-11 62 views
0

即时具有目标c一些怪异编译器错误:目标c ISO C++禁止X的声明无类型

iBody.h:18: error: ISO C++ forbids declaration of 'iObject' with no type 

iObject.h

#import "iElement.h" 
    #import "CCSprite.h" 
    #import "iBody.h" 

    @interface iObject : iElement 
    { 
     iBody *body; 
    } 

    -(iObject*)initElement:(CGPoint)pos 
      withName:(NSString*)name 
      zIndex:(NSInteger)z 
     withImage:(NSString*)image; 

    -(void) addBody: (iBody*) body; 
    -(iBody*) getBody; 

@end 

iBody.h

#import "iObject.h" 
    #import "b2Body.h" 

    @interface iBody : NSObject 
    { 
     CGPoint position; 
     float angle; 
     b2Body *body; 
     iObject *parent; 
    } 

    -(iBody*) initElement: (CGPoint) pos 
     withAngle: (float) angle 
     withParent: (iObject*) el; 

    -(void) setBody: (b2Body*)bdy; 
    -(iObject*) getParent; 

    @end 

有人可以解释为什么会发生这种情况,以及如何解决它。类的实现具有.mm扩展名。

谢谢!

回答

1

由于iBody和iObject的头部相互链接,看起来好像您处于导入循环中。通常在这种情况下我会考虑对IObject是更高的地位和使用iBody.h如下:

// Replace the import to iObject.h with this: 
@class iObject; 

// Add the import back in iBody.mm 
#import "iObject.h" 

现在没有进口环,只有iBody的实现文件实际上是链接到iObject.h,由于没有标题链接到iBody.mm问题就解决了。此外,请记住,在使用Box2D时,将实现文件重命名为.mm(Obj-C/C++),这会让我时不时:)

+0

修复了这个问题谢谢! – blejzz 2012-03-11 13:16:54

2

这是因为您有一个包含头文件的圆圈。

你看,你要包括在iObject.hiBody.h和 'iObject.h' 在iBody.h。因此,编译器会看到这样的事情:

@interface iBody : NSObject 
{ 
    CGPoint position; 
    float angle; 
    b2Body *body; 
    iObject *parent; 
} 

-(iBody*) initElement: (CGPoint) pos 
    withAngle: (float) angle 
    withParent: (iObject*) el; 

-(void) setBody: (b2Body*)bdy; 
-(iObject*) getParent; 

@end 

@interface iObject : iElement 
{ 
    iBody *body; 
} 

-(iObject*)initElement:(CGPoint)pos 
     withName:(NSString*)name 
     zIndex:(NSInteger)z 
    withImage:(NSString*)image; 

-(void) addBody: (iBody*) body; 
-(iBody*) getBody; 

@end 

正如你可以看到iBody不知道iObject当它被拒绝。

要解决这种情况,您应该在@interface iBody: NSObject之前添加字符串@class iObject;,并在iBody.h中删除包含iObject.h的内容。但在执行文件iBody.m您应该导入iObject.h