2

我有以下 Objective-C++ 标头以及返回此指针的简单方法。

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

我创建了简单的方法

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

一切似乎都有效,直到我真正尝试在另一个文件中使用该对象

newObj = [createdMyObj getObj];

它抱怨:错误:在初始化时无法将 'objc_object*' 转换为 'MyCPPObje *'。

该方法似乎是返回一个objective-c对象,但我特意请求了一个C++指针。

MyCPPObj 是一个诚实的 C++ 类:

class MyCPPObj
{
 public:
   int x;
}

我该如何解决?

4

3 回答 3

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将不起作用。(好吧,你可以让它工作,但你通常不希望这样做。)注意行@interface MyObj:NSObject.
  2. 使用NSObject,做#import <Foundation/Foundation.h>
  3. 不要忘记使用.mmObjective-C++ 文件的扩展名。
于 2010-04-13T01:16:06.097 回答
1

错误说明会发生什么,而 JeremyP 是对的。当您忘记在选择器的原型中包含头文件时,编译器会假定选择器返回一个 id 类型的对象。那么 id 是 objc_object* 的 typedef,它与您的 C++ 类不兼容。要修复错误,您只需将头文件包含在您调用 getObj 的文件中。

于 2010-04-13T09:22:50.747 回答
1

很可能您已经忘记#import将头文件与.mm 文件一起@interface放入您使用的 .mm 文件中getObj

于 2010-04-13T06:42:09.887 回答