2012-11-05 3 views
1

나는 주제에 관한 앞의 토론을 여러 번 읽었지만, Objective-C를 처음 접한 이래로 나는 그것을 정말로 이해하지 못했다. (블록, 셀렉터 및 델리게이트는 나에게 매우 새로운 것이다.) 나는 또한 클래스를 구현하는 리시버를 콜백 (rtMidiCallback)이이 내가objective-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; 
} 

C++로 작성되어 그 추상 클래스 RtMidi을 사용하고 있습니다 : 여기

상황이다. 는 그리고 내 주요 파일에 어떤 점에서 나는이 내가 그것을 수행하는 방법 아무 생각이없는 C++ 상황에 있지만, 오브젝티브 C에있을 것입니다이

 midiIn->setCallback(rtMidiCallback); 

뭔가를 작성해야합니다.

아이디어가 있다면 포인터에 관해 이야기 해 드리겠습니다. 대단히 감사합니다.

최고,

greg.

답변

3

C++과 Objective-C를 동일한 프로젝트 내에서 동일 파일 내에서도 (Objective-C++와 파일 확장자 .mm) 사용할 수 있습니다. 사용중인 코드가 C++ 콜백 용으로 고안된 경우이를 제공하고 해당 메커니즘 외부의 다른 객체 유형간에 통신하는 것이 더 쉬울 수도 있습니다.


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


// OCClass.h 

#import <Foundation/Foundation.h> 

class CPPClass; 

@interface OCClass : NSObject { 
    CPPClass *cppObject; 
} 

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

@end 
// CPPClass.h 

#ifndef CPPClass_h 
#define CPPClass_h 

class CPPClass { 
private: 
    id m_ocObject; 

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

    void verifyCPP(); 

}; 

#endif 

이를 활성화하려면, 다른 .mm 파일이있을 것입니다 : Thannk 당신 필립 당신의 대답에 대한

#import "OCClass.h" 
... 
OCClass *test = [[OCClass alloc] init]; 
[test verifyOC]; 
+0

합니다. 그게 내가하려는거야. 하지만 콜백 함수는 다른 objective-c 클래스에 보내려는 구조체를 만듭니다. 나는 그 정보를 전달하는 법을 모릅니다. – user1772776

+1

약간 자세한 설명이 있지만 Objective-C와 C++ 사이의 양방향 호출에 대한 기본 샘플을 답변에 추가했습니다. 아마 그게 도움이 될거야. –

+0

대단히 감사합니다. 당신의 설명은 매우 편리합니다! – user1772776