Цель C и Цель C ++ - PullRequest
       2

Цель C и Цель C ++

1 голос
/ 07 мая 2011

C файлы могут быть изменены из .c в .m файлы и могут быть вызваны из других файлов Objective C (.m файлы).

Файлы C ++ могут быть изменены из .cpp в .mm файлы и могут быть вызваны из других файлов Objective C ++ (.mm файлы).

.m файлов может быть вызывается из .mm файлов .Но .mm файлы нельзя вызывать из .m файлов .

Цель C ++ кодирование необходимо при разработке iPhone как UI будет в Objective C, и любые другие реализованные протоколы не могут быть Objective C ++, так как этот (написанные протоколы) будут вызываться из UI, который написан Objective C .В каком сценарии используется Objective C ++ кодирование?

Ответы [ 2 ]

4 голосов
/ 07 мая 2011

Objective-C ++ используется всякий раз, когда вы хотите смешать код Objective-C и код C ++.

Ваше утверждение, что ".mm файлы не могут быть вызваны из .m файлов", неверно. Если вы поместите C ++ в заголовок , вы не сможете вызвать его из чистого файла Objective-C, но вы можете иметь чисто интерфейс Objective-C для класса, в котором есть реализация, использующая C ++. Типичным примером является упаковка существующего класса C ++ (возможно, некоторой существующей библиотеки) в класс Objective-C.

2 голосов
/ 09 мая 2011
Файлы

.m могут быть вызваны из файлов .mm. Но файлы .mm нельзя вызывать из файлов .m.

Не уверен, что вы подразумеваете под этим, но я думаю, что это неправильно.

Часть "Objective" в Objective-C (++) одинакова для обоих языков. Неважно, является ли реализация Objective-C или Objective-C ++, объекты будут полностью совместимы.

Что имеет значение, так это заголовочный файл, в котором объявлен интерфейс. Например:

@interface Foo
{
   CPPFoo myFoo; // A C++ object
}

@end

нельзя включить в обычный файл Objective-C .m, потому что классы C ++ недопустимы в C. Один из способов обойти это - использовать предварительные объявления и указатели, например,

#if defined __cplusplus
class CPPFoo;
#else
typedef struct CPPFoo CPPFoo;
#endif

@interface Foo
{
   CPPFoo *myFoo; // NOTE: a pointer to a C++ object
}

@end

Вам необходимо добавить указатель в -init и удалить его в -dealloc/-finalize


Нужно ли кодирование Objective C ++ для разработки iPhone

Нет. Раньше я думал (исходя из фона C ++), что было бы лучше использовать C ++ везде и Objective-C только в пользовательском интерфейсе. Однако мне не потребовалось много времени, чтобы понять, что объектная модель Objective-C лучше, чем модель C ++. Так что теперь я рассмотрел бы C ++ только в двух случаях:

  • при взаимодействии с библиотеками, написанными на C ++
  • , если важна производительность и вам нужна встроенная объектная модель (т.е. вы не хотите использовать чистый C)
...