構成
SubView.h (呼ばれる側のヘッダファイル)// C++ から呼ばれるクラスを宣言する
class SubView
{
public:
// C++ から呼ばれる関数
static void callObjC();
};
SubView.mm (呼ばれる側のソースファイル)
#import "SubView.h"
// ヘッダファイルではなく、ソースファイルで Objective-C クラスを宣言する
@interface ClassObjC : NSObject
+ (void)testingMethod;
@end
// 通常通りソースファイルで Objective-C クラスを実装する
@implementation ClassObjC
//--------------------------------------------------
// [Objective-C] テスト用
//--------------------------------------------------
+ (void)testingMethod
{
NSLog(@"C++ から呼ばれました。");
}
@end
//==================================================
// [C++] Objective-C クラスのメソッドを呼ぶ
//==================================================
void SubView::callObjC()
{
[ClassObjC testingMethod];
}
MainView.cpp (呼ぶ側)
#include "SubView.h"
void MainView::mainFunc()
{
SubView::callObjC();
}
要説
Objective-C ファイルに C++ 用の入り口を付けるイメージです。処理順はこのようになります。
- MainView::mainFunc()
- SubView::callObjC()
- [ClassObjC testingMethod]
例えば元々 Objective-C ファイルがある場合、クラスの宣言をソースファイルに移し、呼び出し用の C++ コードを付け足すだけで要件を満たせます。 ただし、そのソースファイルは C++ と Objective-C を含むので、拡張子を .mm にする必要があります。