2011-08-17 32 views
3

對不起,找不到更合適的標題。#目標進口C:我做錯了嗎?

在我的代碼中,我有兩個類應該知道彼此的存在。所以我使用指向其他類的實例變量。爲了這個工作(我猜?)其他類頭文件應該被導入,所以它知道它有哪些方法等。

這裏是我的代碼(精簡)

MainMenuController.h:

#import <Cocoa/Cocoa.h> 
    #import "IRCConnection.h" 

    @interface MainMenuController : NSViewController {  
     IRCConnection *ircConnection; 
    } 

    @property (strong) IRCConnection *ircConnection; 

    @end 

IRCConnection.h:

#import <Foundation/Foundation.h> 
    #import "MainMenuController.h" 

    @interface IRCConnection : NSObject { 

     MainMenuController *mainMenuController; 
    } 

    @property (strong) MainMenuController *mainMenuController; 

    @end 

正如你可以看到他們兩個進口對方,但這在其中一個未知類型名稱'MainMenuController'中創建一個錯誤(未知類型名稱'IRCConnection')。

然而,當連接只是一個方法(例如,僅MainMenuController知道IRCConnection),因此,只有在這兩個中的一個import語句,它工作正常。

我該如何讓他們相互瞭解?兩種方式。

希望這個問題是有道理的。

回答

7

你可以從IRCConnection.h除去進口和使用@class語句。

這樣的:

#import <Foundation/Foundation.h> 

@class MainMenuController; 

@interface IRCConnection : NSObject { 

然後添加#import "MainMenuController.h"IRCConnection.m

+0

這是正確的方法嗎? – Matthijn

+1

沒有「正確的方式」,但通常的做法是'#import'框架,並在頭文件中爲其他類使用'@ class'。在實現('.m')文件中,你可以''在你的'.h'文件中''導入'@ class'的所有東西。這種做法有助於避免'#import'循環和雙'#imports'。 – spudwaffle

+0

我在'.h'中說'@ class',在'.m'中''import'是最接近「正確方式」的東西。至少這是絕對可以接受的做法。 – andyvn22

3

在標題中,使用前向聲明:

@class IRCConnection; 

@interface MainMenuController : NSViewController {  
    IRCConnection *ircConnection; // ok 
} 

在源文件(.m),做#import

+0

以這種方式使用它,該類不知道在IRCConnection中聲明的任何方法,所以我不能調用這些方法。我得到的錯誤是: – Matthijn

+0

看到我更新的答案。 – hamstergene

0

您不能有循環導入。你需要分解它們,或者引入一些前向聲明。

+0

我怎麼能做到這樣的事情? – Matthijn

+0

像其他答案一樣,用@class。或者沒有依賴視圖控制器的IRCConnection。 – Thilo