2013-05-14 2 views
3

해당 메서드에 대한 포인터를 사용하여 objective c 메서드를 호출해야하는 C++ 클래스가 있습니다. 이 메소드는 void를 리턴하고 status가 단순한 정수 enum 인 'status'유형의 인수를 취합니다.C++ 메서드에서 함수 포인터를 사용하여 objective c 메서드 호출

enum status 
{ 
     status_valid = 0, 
     status_invalid, 
     status_unknown 
}; 

나는 obj-c 메소드에 대한 포인터를 이렇게 설정했습니다. 방법에 대한 포인터는 또한 C++ 클래스로 전달되고 있으며

typedef void (*FuncPtr) (status); 
FuncPtr myObjCSelectorPointer = (void (*)(status))[self methodForSelector:@selector(statusChanged:)]; 
cppClassInstance->setFuncPointer(myObjCSelectorPointer) 

myObjCSelectorPointer이 같은 cppClass에 의해 개최되고있다 : 내가 전화하려고

다른 곳에서 이제
void cppClass::setFuncPointer(FunctPtr *ptr) 
{ 
    this->funcPtr = ptr; 
} 

, 메서드는 다음과 같이이 포인터가 가리키고 있습니다.

status s; 
funcPtr(s); 

이 메서드는 올바르게 호출되지만 메서드에 전달 된 값은 손실됩니다. obj-c 메서드는 완전히 임의의 값을받습니다. 같은 방법으로 cpp 클래스에서 메서드를 호출하려고하면 올바른 값을 전달하고 수신합니다.

내가 뭘 잘못하고 있니? 이런 객관적인 방법을 호출 할 수 있습니까?

+0

포스트 상태 정의, 나는 추측하지만 참조하여 상태를 전달하려고하고 있습니다 – makc

+0

게시물에 상태 정의를 추가했습니다. 또한, 나는 그것을 참조로 전달하려고 시도했지만 그 중 하나가 작동하지 않습니다. 나는 그와 같은 문제도 가지고 있었다. – halfwaythru

+0

@halfwaythru 함수 프로토 타입이 잘못되었습니다. 내 대답을 참조하십시오. –

답변

6

문제는 Objective-C 방법의 함수 서명이 생각만큼 간단하지 않다는 것입니다.

오브젝트 지향 프로그래밍을 가능하게하기 위해 Objective-C 메소드는 암시 적 인수 인 id self, SEL _cmd, 호출 객체 및 전송 된 선택자를 전달합니다. 이들은 전달되어야합니다. 메서드를 호출 할 객체를 가져와야하며 선택기도 저장해야합니다. 그런 다음, 정확한 위치에 함수 타입 정의를 변경 :

typedef void (*FuncPtr) (id, SEL, status); 

이 읽어 : [1], [2] (부분 typedef id (*IMP)(id, SEL, ...) 근처)

+0

이것은 유용하게 들리지만 두 가지가 있습니다 : 1.) 함수 프로토 타입이 올바르지 않으면 함수가 호출되지 않아야합니까? 내 obj-c 메소드는이 프로토 타입으로 잘 호출됩니다. 2.) 함수 ptr 프로토 타입을 변경하려고하면 'id'가 선언되지 않은 식별자 인 C++ 헤더에이 함수를 포함해야합니다. 나는 그것을 어떻게 피할 수 있습니까? – halfwaythru

+0

@halfwaysthru 1. 함수가 호출되지 않는 이유는 무엇입니까? 'CALL' 명령은 컴파일러에 의해 생성됩니다 ... 2. Objective-C++로 컴파일하십시오. –

+0

@halfwaythru 1) 아니오. 그것은 여전히 ​​호출 될 것이고, 정의되지 않은 동작을 초래할 수 있습니다. 2) objc 런타임은 C -'#include '이거나 H2CO3이 잠시 전에 말했듯이 objC++로 컴파일 할 수도 있습니다. – justin

관련 문제