1

私はこのテーマに関する以前の議論のいくつかを読みましたが、Objective-Cに比較的慣れていないので、それらを本当に理解していません。(ブロック、セレクター、およびデリゲートは私にとって非常に新しいものです)。

状況は次のとおりです。C++で記述された抽象クラスRtMidiを使用しています。

void MidiInApi :: setCallback( RtMidiIn::RtMidiCallback callback, void *userData )
{
  if ( inputData_.usingCallback ) {
    errorString_ = "MidiInApi::setCallback: a callback function is already set!";
    RtMidi::error( RtError::WARNING, errorString_ );
    return;
  }

  if ( !callback ) {
    errorString_ = "RtMidiIn::setCallback: callback function value is invalid!";
    RtMidi::error( RtError::WARNING, errorString_ );
    return;
}

inputData_.userCallback = (void *) callback;
inputData_.userData = userData;
inputData_.usingCallback = true;
}

また、そのコールバック(rtMidiCallback)を実装するRecieverというクラスもあります。そして、私のメインファイルのある時点で、私はこのようなものを書く必要があります

        midiIn->setCallback(rtMidiCallback);

これはc++のコンテキストになりますが、Objective-Cではその方法がわかりません。

何かアイデアがあれば、私はあなたとそれについて話し合うことができてうれしいです。どうもありがとうございます

一番、

集合。

4

1 に答える 1

3

C++ と Objective-C を同じプロジェクト内、さらには同じファイル (ファイル拡張子 .mm の Objective-C++) 内に含めることができます。使用しているコードが C++ コールバック用に設計されている場合は、それを提供し、そのメカニズムの外部で異なるオブジェクト タイプ間で通信する方が簡単な場合があります。


//  CPPClass.h

#ifndef CPPClass_h
#define CPPClass_h

class CPPClass {
private:
    id m_ocObject;

public:
    CPPClass(id ocObject);
    virtual ~CPPClass();

    void verifyCPP();

};

#endif

//  OCClass.h

#import <Foundation/Foundation.h>

class CPPClass;

@interface OCClass : NSObject {
    CPPClass *cppObject;
}

- (void)ocCallback;
- (void)verifyOC;

@end

//  OCClass.mm

#import "OCClass.h"
#import "CPPClass.h"

#include <iostream>

@implementation OCClass

- (id)init {
    self = [super init];
    if (self) {
        cppObject = new CPPClass(self);
    }
    return self;
}

- (void)dealloc {
    delete cppObject;
}

- (void)ocCallback {
    NSLog(@"Objective-C called from C++");
}

- (void)verifyOC {
    NSLog(@"Objective-C called from Objective-C");
    cppObject->verifyCPP();
}

@end

CPPClass::CPPClass(id ocObject) : m_ocObject(ocObject)
{}

CPPClass::~CPPClass() {}

void CPPClass::verifyCPP() {
    std::cout << "C++ called from Objective-C" << std::endl;
    [m_ocObject ocCallback];
}

これを有効にするには、他の .mm ファイルに次のように記述します。

#import "OCClass.h"
...
OCClass *test = [[OCClass alloc] init];
[test verifyOC];
于 2012-11-05T17:04:29.463 に答える