2011-08-17 21 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