Описание тега objective-c++

Objective-C++ - это объединение наборов синтаксиса Objective-C и 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