Описание тега objective-c++
Objective-C++ - это объединение наборов синтаксиса Objective-C и C++. Objective-C, по определению, является строгим надмножеством языка C; C++ также рассматривается как таковой на практике (хотя и не квалифицируется как строгий надмножество, см. Это иллюстрированное обсуждение), и концептуальное объединение этих двух надмножеств является основой для языка Objective-C++.
Практическое использование Objective-C++ зависит от рассматриваемого компилятора. Вкратце, компиляция в режиме Objective-C++ задействует все базовые настройки компилятора семейства C, а также все расширения C++, а также все расширения Objective-C, а также его собственные нишевые проблемы (например, его поведение в угловых случаях ABI). Несмотря на это преобладание вариантов, которыми можно злоупотреблять, довольно просто скомпилировать Objective-C++ как часть более крупного проекта (как с частями OpenFrameworks) или как основу для отдельного проекта (например, Cedar Pivotal Labs).
По большей части, два языка могут довольно свободно смешиваться - одно важное предостережение заключается в том, что определение класса в C++ не может наследовать от класса Objective-C; аналогично классы Objective-C не могут наследовать от классов C++.
Классы Objective-C можно определить с помощью:
- указатель ivars для указателей на динамически выделяемые экземпляры типов C++
- значение ivars для встроенного хранилища данных C++ для типов, конструируемых по умолчанию
методы класса и экземпляра, которые получают и / или возвращают типы C++
- передать по значению, по указателю, по ссылке (lvalue или rvalue‡)
std::atomic
значения, доступные одновременно из обоихNSThread
и GCD рядом сstd::thread
примитивы ‡
Можно определить классы C++:
- содержащие указатель на члены класса Objective-C (например,
NSURL*
,NSString*
,NSImage*
так далее)- С протестами на объект управления жизненным циклом ква АРК и GC
- как шаблоны, принимающие
NSObject
подклассы какtypename
параметры - с членами метода, которые принимают и / или возвращают
NSObject
экземпляры подкласса- По указателю согласно
[OCType alloc]
возвращаемое значение сообщения
- По указателю согласно
- с членами шаблона метода, которые принимают
NSObject
подклассы какtypename
параметры - которые используют указатели блоков, как ожидалось (например, в
typedef
а такжеusing
‡ декларации)
Примечательно, что Objective-C++ не позволяет:
- Шаблонные структуры классов Objective-C любого типа -
template <…>
синтаксис объявления несовместим с@implementation
/@interface
правила грамматики маркера определения - Шаблонный класс Objective-C или методы экземпляра - например, следующий код соблазнительно попробовать, но полностью недействителен:
@implementation NSSomeThing : NSObject
template <typename T>
+ (T) getValue {
return static_cast<T>(value);
}
@end
… Шаблоны C++ и классы Objective-C используют отдельные несовместимые пути предварительной обработки в соответствующих процессах компиляции.
‡ может использоваться с поддержкой компилятора C++11