Вызов метода экземпляра из метода класса: возможно или нет?

В предыдущем посте я объяснил, что преобразовывал старую программу на 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()» — для краткости обрезанная — находится в отдельном исходном файле в моем классе «Таблицы». К сожалению, попытка построить программу дает мне необъявленную ошибку TablesClass (первое использование в этой функции), даже несмотря на то, что класс был выделен/инициирован ранее в том же файле реализации.

Я часами искал в сети решение, но безрезультатно. Если то, что я пытаюсь сделать, невозможно, как я могу изменить последний метод, чтобы он делал то, что мне нужно? Заранее спасибо :-)


person Bender    schedule 19.02.2011    source источник
comment
Является ли bIs функцией C или методом TablesClass?   -  person BoltClock    schedule 19.02.2011


Ответы (3)


Убедитесь, что вы импортируете файл TablesClass.h, иначе текущий класс не узнает о его существовании, что является распространенной проблемой при работе с этой ошибкой.

person raidfive    schedule 19.02.2011
comment
Привет, рейдпять. Ага. Я перепроверил это тысячу раз, чтобы убедиться, что проблема не в этом. На самом деле я перестарался и дал каждому из семи различных классов все заголовки (независимо от того, нужны они им или нет), просто чтобы убедиться. Никакой разницы, к сожалению. Спасибо за вашу готовность помочь мне здесь :-) - person Bender; 20.02.2011
comment
Ничего страшного, попробовать стоило :) Обычно первым делом проверяю. Интересно узнать, в чем проблема на самом деле. - person raidfive; 21.02.2011

Вы сказали, что ранее "распределили/инициировали" TableClass в том же файле реализации, но похоже, что вы используете его как статический метод. Вам не нужно выделять/инициировать экземпляр класса, когда вы хотите использовать его статические методы. Кроме того, если вы выделяете/инициализируете экземпляр TableClass, это означает, что вы сохранили его где-то, к которому может получить доступ статический метод newSplitB.

person kailoon    schedule 19.02.2011
comment
Привет Кайлун. Я должен был уточнить, когда сказал, что все выделил/инициировал. Исходный код разделен на семь отдельных классов (или групп кода), а группа «Таблицы» содержит смесь методов экземпляра и класса. Подумал, что лучше упомянуть, что я инициировал их все на тот случай, если кто-то подумал, что я, возможно, забыл это сделать (выполнимо... и в этом случае у меня, конечно, не было бы доступа к методам экземпляра). Спасибо, что помогаете мне здесь :-) - person Bender; 20.02.2011

это возможно, и это невозможно, в зависимости от того, как вы это видите:

чтобы вызвать метод экземпляра, вам нужен экземпляр объекта. вы можете отправить это сообщение из метода класса, если у вас есть объект.

без экземпляра класса вы нигде не сможете вызвать метод экземпляра.

вы можете вызывать методы класса из любого места (при условии, что это видно в переводе).

если bIS — это просто функция c, то нет необходимости в том, чтобы она была методом экземпляра. на самом деле, вы можете оставить это как функцию c.

(возможно, расширенный пример поможет нам понять, почему это должен быть метод экземпляра)

person justin    schedule 19.02.2011
comment
Привет Джастин. Хороший вопрос о функциях 'C'. Нет причин, по которым каждая строка этого 18-летнего кода должна быть преобразована в Obj-C, кроме естественной тенденции делать это, что открывает множество других возможностей, таких как использование более простых методов обработки массивов NSMutableArray и т. д. , Но проблема по-прежнему будет заключаться в том, как объявить любые (неизменные) статические методы 'C', такие как мой первый фрагмент, и заставить его скомпилироваться. Код состоит из 1300 строк, поэтому я сосредоточился на известной проблеме, а не на расширенном примере, не зная, где остановиться. Благодарю вас за помощь здесь :-) Дайте мне еще неделю на это... - person Bender; 20.02.2011