Я знаю, что это нестандартно и не принято, пожалуйста, прочтите. У меня есть файл заголовка, который определяет интерфейс и реализацию класса Objective- C.
Person.h
#ifndef Person_h
#define Person_h
@interface Person : NSObject
-(void)speak;
@end
@implementation Person
-(void)speak
{
// Say something
}
@end
#endif /* Person_h */
У меня также есть два исходных файла которые оба включают файл заголовка.
Main.mm
@import Foundation;
#import "Person.h"
int main(int argc, const char * argv[])
{
// Do nothing
}
Test.mm
@import Foundation;
#import "Person.h"
Когда при создании проекта я получаю повторяющиеся ошибки символов.
duplicate symbol '_OBJC_CLASS_$_Person' in:
/Debug/TestBox.build/Objects-normal/x86_64/main.o
/Debug/TestBox.build/Objects-normal/x86_64/test.o
duplicate symbol '_OBJC_METACLASS_$_Person' in:
/Debug/TestBox.build/Objects-normal/x86_64/main.o
/Debug/TestBox.build/Objects-normal/x86_64/test.o
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Я хочу иметь возможность включать один и тот же заголовочный файл в несколько исходных файлов. В C ++ я могу встроить реализацию в файл заголовка следующим образом:
#ifndef Person_h
#define Person_h
class Person
{
public:
void speak()
{
// Say something
}
};
#endif /* Person_h */
Однако я не смог найти способ сделать это с Objective- C. Я использую Objective- C, поэтому могу создавать подклассы событий из NSWindowDelegate и NSResponder.
Я пробовал искать решения. Большинство из них заявили, что нужно разделить реализацию в исходный файл, но это нарушит архитектуру с одним заголовком. Одно из предложений - использовать Objective- C библиотеку времени выполнения и создавать мои классы во время выполнения. Кажется, это дает мне результаты, которые я ищу, но мне интересно, есть ли более простой способ.
Есть ли способ реализовать класс Objective- C в файле заголовка, чтобы он может быть включено несколько исходных файлов? Или лучший вариант - динамическое создание классов во время выполнения?
Обновление
Я ищу решение, которое позволяет избежать использования файлов .m или .mm для написания реализации Objective- C. Даже если это не обычный способ сделать это. Файл с одним заголовком требуется архитектурой проекта, над которым я работаю. Проект является кроссплатформенным, и дизайн с одним заголовком не является проблемой для C ++ на Windows и Linux. Добавление исходного файла для определения объектов Objective- C нарушит существующую архитектуру.