2012-01-05 113 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的頭。