Объективный член C в классе C ++ - PullRequest
4 голосов
/ 23 октября 2010

Возможно ли иметь объективный член 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 ]

7 голосов
/ 23 октября 2010

Чтобы создать заголовочные файлы, которые могут быть разделены между кодом 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.

2 голосов
/ 24 октября 2010

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

...