2

私は次の目的を持っています-このポインタを返す簡単なメソッドを持つ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];
}

あなたが陥ったかもしれない2つの落とし穴:

  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

おそらく、を使用する.mmファイルへ#importのヘッダーファイルを忘れている可能性があります。 @interfacegetObj

于 2010-04-13T06:42:09.887 に答える