2011-10-18 9 views
4

Objective-CとObjective-C++の両方から使用可能なObjective-C++クラスインターフェイスを作成しています。問題はObjective-Cから使用可能でなければならないので、単にC++型を使うことができないということです。私はポインタを使用してそれをやりたいと思います:Objective-CコードでObjective-C++インスタンス変数を使用する

@interface SXDiff : NSObject { 
@private 
#ifdef __cplusplus 
    dtl::Diff<std::string, std::vector<std::string> > *_diff; 
#else 
    void *_diff; 
#endif 
} 

... 

@end 

このとき何らかの問題が発生する可能性がありますか?これを行うより良い方法はありますか?


ポインタの使用がちょうどIVARの大きさは、Objective-CのとObjective-C++の両方で同じになるように取得することであることに注意してください。 ivarはクラス実装のSXDiff@private)からのみ使用できます。この実装はObjective-C++で記述されています。

+0

なぜあなたがobj-Cを使いたいん興味があるだけ ? –

+0

私はObjective-Cで書かれたアプリケーションを持っており、そのクラスの1つでC++コードを使いたいと思っています。 –

+0

あなたはどちらのコンパイラを使用していますか? LLVM 2.0以降では、クラス拡張を使って実装ファイルに 'dtl :: Diff'を宣言できます。 – Joe

答えて

5

Apple LLVMバージョン2.0以降では、すべてのC++コードをヘッダーからクラス拡張に移動してみてください。

//SXDiff.h 
@interface SXDiff : NSObject { 
} 

... 

@end 


//SXDiff.mm 
#include "dtl/dtl.hpp" 

@interface SXDiff() 
{ 
    dtl::Diff<std::string, std::vector<std::string> > *_diff; 
} 
@end 

@implementation SXDiff 

... 

@end 
+0

GCCはこれを試してみるといつも私にエラーが出たので、これが可能であるかどうかはわかりませんでした。 clangはしません。ありがとう!これにより、ポインタの必要もなくなります。 –

+1

BTW、最新のSDKの新機能:クラス拡張を使用するのではなく、@implementationの後に{}ブロックを使用してivarsを追加できるようになりました。 –

関連する問題