Объективный член C в классе C++

Возможно ли иметь объективный член c в классе C++

@interface ObjectiveCClass : UIViewController  {

    int someVarialbe;

}
- (void)someFunction;

@end


class CPlusPlusClass{
      ObjectiveCClass obj;          // have a objective c member

      void doSomething(){
           obj.someFunction;        // and call a objective c method
       }
};

Любое руководство будет по достоинству оценено.

ура

2 ответа

Решение

Чтобы создать заголовочные файлы, которые могут быть разделены между кодом obj-c и cpp, вы можете использовать предопределенные макросы компилятора, чтобы сделать что-то вроде:

// A .h file defining a objc class and a paired cpp class
// The implementation for both the objective C class and CPP class
// MUST be in a paired .mm file
#pragma once

#ifdef __OBJC__
#import <CoreFoundation/CoreFoundation.h>
#else
#include <objc/objc.h>
#endif

#ifdef __OBJC__

@interface ObjectiveCClass :
...

typedef ObjectiveCClass* ObjectiveCClassRef;

#else

typedef id ObjectiveCClassRef;

#endif

#ifdef __cplusplus

class CPlusPlusClass {
  ObjectiveCClassRef obj;

  void doSomethind();
};

#endif

Я не уверен на 100%, что законно иметь тип изменения ObjectiveCClassRef, подобный тому, который существует между сборками c / cpp и obj-c. Но id является совместимым с ac / cpp типом, определенным в файлах заголовков целевого C и способным хранить указатель целевого класса C, и, при использовании в файлах.m или.mm, позволяет вызывать объект напрямую, используя синтаксис объективного C.

Существует диалект Objective-C под названием Objective-C++, который взаимодействует с C++ так же, как Objective-C взаимодействует с C. Вы можете либо изменить настройку файла на Objective-C++, либо изменить расширение на ".mm". Вам по-прежнему нужно будет обращаться к объектам Objective-C через указатели и танцевать alloc-init и все это, конечно.

Другие вопросы по тегам