18

私はC++とObjective-Cを混在させようとしています。ほとんどの方法で作成しましたが、Objective-CとC++コードの間に単一のインターフェイスクラスが必要です。したがって、ViewControllerインターフェイスに永続的なC++オブジェクトが必要です。

これは、タイプのない'myCppFile'の宣言を禁止することで失敗します。

#import <UIKit/UIKit.h>
#import "GLView.h"
#import "myCppFile.h"

@interface GLViewController : UIViewController <GLViewDelegate>
{
    myCppFile cppobject;
}

@end

ただし、これは.mm実装ファイルでは問題なく機能します(cppobjectを呼び出し間で保持したいので機能しません)

#import "myCppFile.h"
@implementation GLViewController
- (void)drawView:(UIView *)theView
{
    myCppFile cppobject;
    cppobject.draw();
}
4

4 に答える 4

28

不透明なポインターを使用し、Objective-C クラスを実装するファイルに C++ ヘッダーのみを含める必要があります。そうすれば、ヘッダーを含む他のファイルに Objective-C++ の使用を強制することはありません。

// header:
#import <UIKit/UIKit.h>
#import "GLView.h"

struct Opaque;

@interface GLViewController : UIViewController <GLViewDelegate>
{
    struct Opaque* opaque;
}
// ...
@end

// source file:
#import "myCppFile.h"

struct Opaque {
    myCppFile cppobject;
};

@implementation GLViewController
// ... create opaque member on initialization

- (void)foo
{
    opaque->cppobject.doSomething();
}
@end
于 2010-02-14T19:17:07.280 に答える
3

GLViewController.hインクルードするすべてのファイルが Objective-C++ ソース (*.mm)であることを確認してください。

ビュー コントローラーのヘッダーに C++ コードを含める場合、このヘッダーをインポートするすべてのソースはそれを理解できる必要があるため、Objective-C++ である必要があります。

于 2010-02-14T18:45:36.000 に答える
2

.mm ファイルのインターフェイス ブロックで C++ オブジェクトを宣言する必要があります。

.mm:

#include "SomeCPPclass.h"

@interface SomeDetailViewController () {
    SomeCPPclass*    _ipcamera;
}
@property (strong, nonatomic) UIPopoverController *masterPopoverController;
- (void)blabla;
@end
于 2013-08-11T15:52:27.117 に答える
0

trueプロジェクト設定で次のフラグを設定する必要があると思います。

GCC_OBJC_CALL_CXX_CDTORS = YES

これにより、Objective-C クラスで C++ オブジェクトをインスタンス化できるようになります。

于 2010-02-14T17:41:33.967 に答える