2010-04-13 6 views
2

У меня есть следующий заголовок объектно-C++ с простым методом для возврата этого указателя.как вернуть указатель C++ в объекте-C++

@interface MyObj 
{ 
    MyCPPObj * cpp; 
} 
-(MyCPPObj *) getObj; 

Я создал простой метод

@implementation MyObj 
-(MyCPPObj *) getObj 
{ 
    return cpp; 
} 

Все, кажется, работает, пока я на самом деле не попробовать использовать объект в другом файле

newObj = [createdMyObj getObj]; 

Он жалуется: ошибка: не удается преобразовать ' objc_object * 'до' MyCPPObje * 'при инициализации.

Кажется, что метод возвращает объект объектива-c, но я специально запросил указатель C++.

MyCPPObj честный C++ класс:

class MyCPPObj 
{ 
public: 
    int x; 
} 

Как я могу исправить это?

+0

Где ваше объявление для 'MyCPPObj'? –

+0

'-getObj' - очень плохое имя для метода доступа. Методы, включая слово * get *, зарезервированы для методов, возвращающих буфер байтов. В примере, который вы укажете, аксессуар должен быть назван '-cpp'. –

+0

Это нормально, чтобы дать аксессуру другое имя, чем переменная экземпляра, но да, он не должен иметь 'get', если он не возвращает что-то по ссылке. Это должно быть просто 'obj' или' cpp' или 'cppObj' или что-то в этом роде. Кроме того, вы можете использовать синтаксис '@ property' для объявления этого свойства. http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html –

ответ

1

Скорее всего вы забыли #import заголовочный файл с @interface в файл .mm, где вы используете getObj.

3

На моей машине 10.6.3, следующая комбинация работала без каких-либо проблем: aho.h

#import <Foundation/Foundation.h> 
class MyCPPObj{ 
}; 
@interface MyObj:NSObject 
{ 
    MyCPPObj * cpp; 
} 
-(MyCPPObj *) getObj; 
@end 

aho.mm и

#import <Foundation/Foundation.h> 
#import "aho.h" 

void foo(){ 
    MyObj*objcObj=[[MyObj alloc] init]; 
    MyCPPObj*cppObj=[objcObj getObj]; 
} 

Два подводных камней вы можете перешедших в:

  1. В отличие от C++, класс в Objective-C, который не наследуется от NSObject wo не работа. (Ну, вы можете заставить его работать, но обычно этого не требуется). Обратите внимание на строку @interface MyObj:NSObject.
  2. Чтобы использовать NSObject, сделать #import <Foundation/Foundation.h>
  3. Не забудьте использовать расширение .mm для файлов Objective-C++.
1

Ошибка говорит о том, что происходит, и Джеремип прав на деньги. Когда вы забудете включить заголовочный файл с прототипами селекторов, компилятор предполагает, что селектор возвращает объект типа id. Ну id - это typedef для objc_object *, что несовместимо с вашим классом C++. Чтобы исправить ошибку, вам просто нужно включить файл заголовка в файл, в котором вы назвали getObj.

Смежные вопросы