2011-02-19 127 views
0

在之前的文章中,我解釋說我正在將舊的'C'程序轉換爲Objective-C,並瞭解了消息傳遞(舊版本)靜態方法和類方法之間的區別。從類方法調用實例方法:可能或不可以?

但是,我現在怎麼能得到一個類方法來調用一個實例方法(假設它甚至可能)?這裏是原來的(靜態)函數:

static int newSplitB(int b, int hi, int lo, int found) 
{ 
int hlp; 

if(hi - lo <= 1) 
    return 0; 

    bIs(lo + (hi - lo + 1)/2); // calls function bIs(); 
    return 1; 
} 

和完全相同的代碼 '翻譯' 成的OBJ-C:

+(int)newSplitB :(int)b :(int)hi :(int)lo :(int)found 
{ 
int hlp; 

if((hi - lo) <= 1) 
    return 0; 

[TablesClass bIs:(lo+(hi-lo+1)/2)]; // gives compile error 
return 1; 
} 

的 '雙()' 功能 - 剪斷,爲了簡潔 - 是坐在我的'表'類的一個單獨的源文件中。不幸的是,儘管該類已經在相同的實現文件中被分配/更新過,但試圖構建該程序給了我一個未聲明(首次在此函數中使用)的'TablesClass'錯誤。

我已經搜索了一個解決方案的網絡小時,但無濟於事。如果我想要做的事情是不可能的,我怎麼能修改最後的方法來做我以後的事情?在此先感謝:-)

+0

是'bIs` C函數或`TablesClass`方法? – BoltClock 2011-02-19 06:21:16

回答

1

請確保您正在導入TablesClass.h文件,否則當前類將不知道它的存在,並且是處理此錯誤時的常見問題。

+0

嗨raidfive。對。我已經重新檢查了這一千次,以確保這不是問題。事實上,我過度殺傷,併爲七個不同類別中的每一個都提供了所有的標題(無論他們是否需要)來確保。不幸的是,沒有任何區別。感謝您的意願,幫助我在這裏:-) – Bender 2011-02-20 03:41:37

+0

沒問題,這是值得一試:)通常我檢查的第一件事。有興趣看看實際問題是什麼。 – raidfive 2011-02-21 00:35:16

1

你說你在同一個實現文件中的「alloc/inited」TableClass早些時候,但它好像你正在使用它像一個靜態方法。當你想使用它的靜態方法時,你不必分配/初始化一個類的實例。另外,如果你在TableClass的實例中分配/ init,那就意味着你將它存儲在靜態方法newSplitB可以訪問的地方。

+0

嗨kailoon。我應該澄清,當我說我已經分配/編入了一切。原始代碼被分成七個不同的類(或代碼組),'Tables'組包含實例和類方法的** mix **。以爲我最好提一下,我把它們全部引入,以防萬一有人認爲我可能會忽略這樣做(可行......而在這種情況下,我當然不會有權訪問實例方法)。感謝你幫助我:-) – Bender 2011-02-20 03:43:12

1

這是可能的,而且是不可能的,這取決於你如何看待它:

調用一個實例方法,你需要一個對象的實例。如果有對象,可以從類方法發送此消息。

如果沒有該類的實例,則無法在任何地方調用實例方法。

您可以從任何地方調用類方法(假設它在翻譯中可見)。

如果bIS只是一個c函數,那麼沒有需要它是一個實例方法。事實上,你可以把它作爲一個c函數。

(也許一種擴展,將有助於我們理解爲什麼這必須是一個實例方法)

相關問題