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;
}

'bIs()'関数(簡潔にするために省略)は、'Tables'クラスの別のソースファイルにあります。残念ながら、プログラムをビルドしようとすると、クラスが同じ実装ファイルで以前に割り当て/初期化されていても、「TablesClass」が宣言されていない(この関数で最初に使用)エラーが発生します。

私は解決策を探すために何時間もネットを検索しましたが、役に立ちませんでした。私がやろうとしていることが不可能な場合、最後のメソッドを変更して、私が求めていることを実行するにはどうすればよいですか?前もって感謝します :-)

4

3 に答える 3

1

ファイルをインポートしていることを確認してください。TablesClass.hそうしないと、現在のクラスがその存在を認識せず、このエラーを処理する際の一般的な問題になります。

于 2011-02-19T06:21:41.010 に答える
1

同じ実装ファイルで以前にTableClassを「割り当て/初期化」したとおっしゃいましたが、静的メソッドのように使用しているようです。静的メソッドを使用する場合、クラスのインスタンスを割り当て/初期化する必要はありません。また、TableClassのインスタンスでalloc / initを実行すると、静的メソッドnewSplitBがアクセスできる場所に格納したことになります。

于 2011-02-19T06:28:27.713 に答える
1

あなたがそれをどのように見るかに応じて、それは可能であり、不可能です:

インスタンスメソッドを呼び出すには、オブジェクトのインスタンスが必要です。オブジェクトがある場合は、クラスメソッドからこのメッセージを送信できます。

クラスのインスタンスがないと、どこでもインスタンスメソッドを呼び出すことはできません。

クラスメソッドはどこからでも呼び出すことができます(翻訳で表示されていると仮定します)。

bISが単なるac関数の場合、インスタンスメソッドである必要はありません実際、ac関数のままにしておくことができます。

(拡張された例は、これがインスタンスメソッドでなければならない理由を理解するのに役立つかもしれません)

于 2011-02-19T06:30:14.707 に答える