2012-01-05 134 views
0

我有一类结构错误与包括文件

Class A 
{ 
    Object of classB 
    Object of classC 
} 

现在对于这个目的,我所拥有的文件啊/业余了Bh/BM,CH /厘米 现在我有一个单独的文件Gh的具有多项全球所有A,B,C类使用的变量现在我已经在B中输入了Bh,Ch,Gh。我也分别导入了B.h和C.h中的文件G.h

现在,当生成项目时,我收到全局变量上重复符号的链接错误(这可能是由于文件G.h的多重包含)。

我该如何解决这个问题?下面是我的代码结构

//A.h 

#import "B.h" 
#import "C.h" 
#import "G.h" 

@interface A : NSObject { 
    B *b; 
    C *c; 
} 
//B.h 
#import "G.h" 

//C.h 

#import "G.h" 

//G.h 
A *a=nil; 
@interface G : NSObject { //whole class is empty} 
+0

让我们看看实际的代码 – Mark 2012-01-05 13:59:04

回答

3

你应该声明您的全局中G.hG.m定义他们,让他们的目标只有链接一次。所以,如果,例如,你有一个字符串常量,的全局定义,你会怎么做:

G.h

extern NSString const *appName; 

G.m

NSString const *appName = @"My Great App"; 

在你粘贴代码,它是A正在重复的实例。它被导入到每个其他翻译单元中,但每次都有相同的名称,这意味着编译对象不能链接。假设你要共享A实例调用a,你会怎么做:

G.h

@class A; 
extern A *a; 

G.m

#import "A.h" 
#import "G.h" 

A *a = nil; 
+0

非常感谢..确实犯了一个非常根本的错误 – 2012-01-06 10:21:24

0

使用@class编译器指令在类的头,而不是导入其他类的标题。 @class提供了前向声明给定的类,所以你可以推迟导入它的头,直到你真的需要它,这通常会在相应的.m文件中。

因此,而不是像这样:

#import "B.h" 

@interface A : NSObject 
{ 
    B someObj; 
} 

...这样做

@class B; 

@interface A : NSObject 
{ 
    B someObj; 
} 

现在,编译器会明白B是一个类的名称,因此允许您使用它作为一个数据类型,不需要导入B的头。