2011-02-19 116 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函数。

(也许一种扩展,将有助于我们理解为什么这必须是一个实例方法)

相关问题