21174


ブリッジヘッダを利用して下記のような感じで、  
Objctive-C→C++クラスのメソッドを使用することは確認できました。

> CTest *test = new CTest(); // Objctive-Cクラスで、C++クラスCTestを生成  
>  test->test_print(); // C++クラスのメソッド呼び出し（printf()文をいれただけ）

C++クラスから処理終了時にObjctive-Cクラスのメソッドを  
コールしてもらうことは可能なのでしょうか。

> test->test_start(callback);  
>  // イメージ： Objctive-Cクラスで、C++クラスのメソッドにObjctive-Cクラスで呼んでもらいたいメソッドを指定


CC BY-SA 3.0
2016-01-20T09:26:00.440
21123
2016-02-16T12:08:26.880
2016-02-16T12:08:26.880
12842
12842
question
objective-c
Objctive-C、C++間で関数コールしたい。


Objective-C++を使えば、どちらも問題なくできます。

以下、簡単なサンプルを書いてみました。  
（Xcode 7.2で確認）

### Objective-Cで書かれたクラス

・ObjectClass.h

[code]

    #import <Foundation/Foundation.h>
    class CppClass;
    
    @interface ObjectClass : NSObject
    - (void)testPrint;
    - (void)classPrint:(CppClass*)cc;
    @end
    
[/code]

・ObjectClass.mm

[code]

    #import "ObjectClass.h"
    #include "CppClass.h"
    
    @implementation ObjectClass
    - (void)testPrint {
        NSLog(@"ObjectClass::testPrint()");
    }
    
    - (void)classPrint:(CppClass*)cc {
    
        // Objective-CのなかからC++のメソッドを呼び出し
        cc->testPrint();
    }
    @end
    
[/code]

### C++で書かれたクラス

・CppClass.h

[code]

    #ifndef CppClass_h
    #define CppClass_h
    
    #import <Foundation/Foundation.h>
    @class ObjectClass;
    
    class CppClass
    {
    public:
        CppClass();
        ~CppClass();
    
        void testPrint(void);
        void objectPrint(ObjectClass* oc);
    };
    
    #endif /* CppClass_h */
    
[/code]

・CppClass.mm

[code]

    #include "CppClass.h"
    #import "ObjectClass.h"
    
    CppClass::CppClass()
    {
    }
    
    CppClass::~CppClass()
    {
    }
    
    void CppClass::testPrint(void)
    {
        NSLog(@"CppClass::testPrint()");
    }
    
    void CppClass::objectPrint(ObjectClass* oc)
    {
        // C++のなかからObjective-Cのメソッドを呼び出し
        [oc testPrint];
    }
    
[/code]

### 実際の処理

※ViewController.hは省略

・ ViewController.mm

[code]

    #import "ViewController.h"
    
    #import "ObjectClass.h"
    #include "CppClass.h"
    
    @interface ViewController ()
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        [self cppToObjectiveC];
        [self objectiveCToCpp];
    }
    
    /// C++のオブジェクトをObjective-Cから使用
    - (void)cppToObjectiveC {
    
        CppClass* cc = new CppClass();
    
        ObjectClass* oc = [[ObjectClass alloc] init];
        [oc classPrint:cc];
    
        delete cc;
    }
    
    /// Objective-CのオブジェクトをC++から使用
    - (void)objectiveCToCpp {
    
        ObjectClass* oc = [[ObjectClass alloc] init];
    
        CppClass* cc = new CppClass();
        cc->objectPrint(oc);
    
        delete cc;
    }
    
    @end
    
[/code]

拡張子を.mmにするのさえ忘れなければ、特に問題はないかと思われます。


CC BY-SA 3.0
2016-01-22T05:26:21.993
21174
2016-01-22T05:26:21.993
7459
21123
answer