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;
}

我还有一个 Reciever 类,它实现了该回调(rtMidiCallback)。在我的主文件中的某个时候,我需要写这样的东西

        midiIn->setCallback(rtMidiCallback);

这将在 c++ 上下文中,但在 Objective-C 中我不知道该怎么做。

如果您有任何想法,指点,我很乐意与您讨论。非常感谢你

最好的,

格雷格。

4

1 回答 1

3

C++ 和 Objective-C 可以在同一个项目中,甚至在同一个文件中(Objective-C++ 文件扩展名为 .mm)。如果您使用的代码是为 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 回答