2013-01-04 66 views
0

可能重复:
How can I solve this Problem with bidirectional dependencies in Objective-C classes?相互依赖导致编译错误

为什么我收到一个“解析问题 - 期望一个类型”下面的代码,我可以做什么解决它(不改变我的测试功能的API)?

// ClassA.h 

#define CLASSA_H 

#import <Foundation/Foundation.h> 
#ifndef CLASSB_H 
#import "ClassB.h" 
#endif 

@interface ClassA : NSObject {} 

- (void)test:(ClassB *)input; // Compiler error: Expected ClassB to be a type 

@end 

// ClassB.h 

#define CLASSB_H 

#import <Foundation/Foundation.h> 
#ifndef CLASSA_H 
#import "ClassA.h" 
#endif 

@interface ClassB : NSObject{} 

- (void)test:(ClassA *)input; // Compiler error: Expected ClassA to be a type 

@end 

根据我了解的进口对包括,我不应该甚至必须使用CLASSA_H和CLASSB_H宏来防止自包含的,但无论我使用它们或不使用,我会得到同样的错误。

我的实际代码比上面的示例更复杂,但归结为我有两个接口相互引用的类,因此需要每个头都包含另一个头,如上例所示。这是C中的一种常见情况,我没有得到我在这里失去的东西。

回答

2

您不需要包含任何标头。使用forward declaration

// ClassA.h 

#import <Foundation/Foundation.h> 

@class ClassB; 

@interface ClassA : NSObject {} 

- (void)test:(ClassB *)input; 

@end 

// ClassB.h 

#import <Foundation/Foundation.h> 

@class ClassA; 

@interface ClassB : NSObject {} 

- (void)test:(ClassA *)input; 

@end 

根据您的情况,您可能还需要#import "ClassA.h"ClassB.m内,反之亦然。但是这不会导致任何其他问题。

+0

太好了。谢谢。只要可能,使用前向声明而不是导入是一种好的做法,或者只要我没有遇到像上面那样的问题,坚持导入就可以了吗? – Lolo

+0

这通常是一种很好的做法。当编译器和计算机速度较慢时,这一点更为重要。直到你的项目或头文件变得巨大,这些日子里不太可能有明显的区别。我的印象是使用C++更重要,但可能会过时。 –