Ваш вопрос носит довольно общий характер, поэтому я могу дать лишь несколько советов по высокоуровневой архитектуре для преимущественно приложений на C ++, которые вы хотите портировать на Mac OS X и иметь собственный пользовательский интерфейс Cocoa.
Потоки: Тот факт, что код C ++ имеет основной поток в Windows, не означает, что он должен быть в Mac OS X. Запустите ваше приложение обычным способом Cocoa с NSApplication, а затем в applicationDidFinishLaunching
вашего делегата приложения, вы должны сделать двавещи:
- Запустите NSThread, даже если он ничего не делает и просто сразу возвращается.Вы должны сделать это, чтобы переключить Какао, чтобы быть внутренним потокобезопасным (таким, как это может быть).Поскольку ваш код C ++ вместо этого будет запускать pthreads, вам нужно сначала запустить хотя бы один NSThread более высокого уровня.
- Вызовите процедуры запуска вашего кода C ++.Если этот код долго выполняется, запустите отдельный поток.Нет никаких причин, по которым ваш код C ++ должен выполняться в главном потоке в Mac OS X;это может быть на любой вспомогательной нити.Единственная особенность основного потока в Mac OS X состоит в том, что туда доставляются события и оттуда должны происходить изменения пользовательского интерфейса.Обе эти вещи должны обрабатываться в собственном коде Какао, а не в переносимом коде C ++.
Языковой барьер У вас есть языковой барьер, с которым нужно иметь дело.Ваш код C ++ не может напрямую обращаться к объектам Objective-C и наоборот.Вы можете сгладить эту проблему с помощью Objective-C ++, но лучше всего использовать Objective-C ++ только для тонкого слоя перевода и держать их отдельно.Помимо обеспечения более канонической среды программирования, она также помогает логически отделить код пользовательского интерфейса (в Objective-C) от сервисов приложений более низкого уровня (в C ++).Роб Нейпир много писал о том, как это сделать, и я предлагаю прочитать его недавнее сообщение в блоге вместе с некоторыми из его более ранних публикаций на эту тему.
Для более общей разработки вы будетеиспользовать одну из нескольких техник для перехода с C ++ на Objective-C, поскольку это направление, о котором вы спрашивали:
Предоставьте интерфейсные функции C, которые можно вызывать из Objective-C или C ++.Их реализация может быть написана на любом удобном для вас языке.Заголовок для этих функций будет иметь следующие строки, чтобы код на C ++ знал, что они имеют интерфейсы C, а не C ++:
#if defined __cplusplus
extern "C" {
#endif
void passAString(const char *string);
// ... some other C interface functions
#if defined __cplusplus
}
#endif
Предоставляет функции моста Objective C ++, которые принимают объекты C ++и преобразовал их в объекты Objective-C перед вызовом собственного кода Objective-C.
Напишите объекты моста Objective-C ++.Они обеспечивают тонкий облик C ++ для базового объекта Objective-C, так что слой C ++ может взаимодействовать с ним.
Очевидно, что вам придется использовать аналогичные методы в обратном порядке для вызова из Objective-Код C на C ++.