Объявите внешние функции в проекте Какао / Obj-C - PullRequest
0 голосов
/ 06 мая 2009

Хорошо, здесь идет. Я закончил фундаментальный инструмент Какао, который вычисляет среднее абсолютное отклонение случайных целых чисел (так же, как учебный проект).

Я переместил вычисление в функцию с именем "findMeanAbsoluteDeviation ()". Он принимает NSMutableArray объектов NSNumber для предварительных расчетов. В любом случае. Так что это прекрасно работает, когда я объявляю это в том же файле ".m", что и мой другой код.

#import <Foundation/Foundation.h>

float findMeanAbsoluteDeviation(NSMutableArray * array);

int main (int argc, const char * argv[]) {
    ...generate random integers, execute function...
    meanAbsoluteDeviation = findMeanAbsoluteDeviation(numArray);
}

float findMeanAbsoluteDeviation(NSMutableArray * array) {
    ...mean absolute deviation maths...

}

и работает нормально. Теперь я хотел бы переместить функцию во внешний файл. Я создал Подкласс NSObject назван "безумным". Я переместил функцию в свой безумный «mad.m», прочитал, а затем переформатировал объявление, чтобы оно выглядело как

-(float)findMeanAbsoluteDeviation:(NSMutableArray *)array {
    ...code...
}

и в моем файле "mad.h".

@interface mad : NSObject {

}

    - (float)findMeanAbsoluteDeviation:(NSMutableArray *)array;

@end

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

#import "mad.m"

в начало моего файла "main.m" и используйте эту функцию, как обычно. Ну, похоже, он неправильно компилируется.

ld: duplicate symbol .objc_class_name_mad in ------standardDeviation.build/Debug/standardDeviation.build/Objects-normal/i386/mad.o and ------standardDeviation.build/Debug/standardDeviation.build/Objects-normal/i386/standardDeviation.o

"------" опущено для длины

Command /Developer/usr/bin/gcc-4.0 failed with error code 1

Есть идеи? Спасибо за вашу помощь!

1 Ответ

3 голосов
/ 06 мая 2009

Вы хотите #import "mad.h", а не #import "mad.m", иначе реализация класса оценивается дважды, поэтому вы видите ошибку.

Несколько стилистических точек:

  • Если вы не используете переменные экземпляра объекта ни для чего, вы обычно пишете метод класса (+), а не метод экземпляра (-).
  • Нет проблем с объявлением прототипа функции C в заголовочном файле Objective-C, если интерфейс класса не имеет смысла для того, что вы делаете. См. NSGeometry.h для некоторых примеров.
  • Если вы не изменяете массив в функции или методе, не используйте параметр изменяемого массива.
  • Рассмотрите возможность использования стандартных соглашений об именах Какао для классов, методов и функций.

Например:

@interface MEMeanAbsoluteDeviation : NSObject {
}
+ (float)meanAbsoluteDeviation:(NSArray *)array;

или просто:

float MEMeanAbsoluteDeviation(NSArray *array);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...