2014-04-13 5 views
4

C++ 코드에서 C 라이브러리에 종속되어 있습니다. 이 C 라이브러리는 3 개의 인수로 콜백을 정의 할 수있게 해준다. 예 :C++의 정적 멤버 함수가 정적이 아닌 참조에 액세스해야합니다.

file.c 이것은 내가에 콜백으로 직접 멤버 함수를 통과 할 수 없기 때문에

는 C에서
#ifdef __cplusplus 
extern "C"{ 
#endif 
    typedef void(*callback)(argument* 1, argument* 2, argument* 3); 
... 
    void set_callback(ARG1, callback name_of_callback); 
... 

++ 라이브러리 내가, 내가이 콜백 클래스의 멤버 함수가되고 싶어요 개발하고 있어요 C 라이브러리 정적 함수를 콜백으로 만들었고이 정적 함수 안에 클래스 객체에 대한 참조를 갖고 작업을 수행하는 멤버 함수를 호출하려고합니다.

이제 내 정적 함수는 C 라이브러리에서 지정한 3 개의 인수가 있어야하므로 정적 함수 내에서 클래스의 개체에 대한 참조를 얻는 방법을 찾지 못한다. . I의 예하고 싶어 :

에서 MyClass.h :

class MyClass: 
public: 
    MyClass(); 
    void my_function(argument*1, argument* 2, argument* 3); 
    static void my_callback(argument* 1, argument* 2, argument*3); 

인 MyClass.cpp :

MyClass::MyClass(){ 
    set_callback(ARG1, my_callback); 
} 

void MyClass::my_function(argument*1, argument* 2, argument* 3){ 
     /* Do something */} 
void MyClass::my_callback(argument* 1, argument* 2, argument*3){ 
    Object->my_function(1, 2, 3); 
} 

정적 내가 할 수 원하는대로 클래스 멤버를 설정하지하는 이유 테스트 목적으로이 클래스의 객체를 만들고 파괴하고 테스트 내에서 객체의 상태를 제어합니다.

g ++ 및 gcc를 사용하고 있습니다. 누군가 도움을 얻을 수 있기를 바랍니다. 미리 감사드립니다.

+3

'set_callback' 호출이 나중에 콜백에 전달 된 인수 중 하나를 제공하는 것처럼 보입니까? MyClass *를 해당 매개 변수를 통해 전달하십시오. –

답변

1

당신은 정적 멤버 함수 또는이 할 수있는 순수 'C'기능을 만들 수 있습니다, 아래에있는 내 예를 고려해

/** 
* C++ part 
*/ 
class obj 
{ 
public: 
    obj() {} 
    ~obj() {} 

    void doSomething(int a, int b) { cout << "result = " << a+b << endl; } 
}; 

/** 
* C Part 
*/ 
#ifdef __cplusplus 
extern "C" 
#endif 
{ 
typedef void (*callback)(void* one, void* two, void* three); 

callback g_ptr = NULL; 
void* arg = NULL; 

void c_lib_core (void) 
{ 
    printf ("C Lib core...\n"); 
    if (g_ptr) 
    { 
     g_ptr(arg, NULL, NULL); 
    } 
} 

void set_callback (void* arg, callback ptr) 
{ 
    g_ptr = ptr; 
} 

void my_callback (void* one, void* two, void* three) 
{ 
    obj* my_obj = (obj*) one; 

    my_obj->doSomething(1,2); 
} 

#ifdef __cplusplus 
} 
#endif 



int main (void) 
{ 
    obj a; 

    set_callback (&a, my_callback); 

    c_lib_core(); 
} 

출력 :

C Lib core... 
result = 3 

인수 1로 C++ 객체에 대한 포인터를 전달합니다. 콜백을 통해 C++로 다시 캐스팅하고 호출 할 수 있습니다. c_lib_core는 테스트 목적으로 콜백 함수의 콜백을 시뮬레이션 할 수 있습니다. 이것은 전역 변수와 함께 어딘가에서 C 코드에있게됩니다. 단일 C 함수를 구현하고 객체에 ARG1을 설정하기 만하면됩니다.

+0

나는 내 객체, set_callback 함수 및 my_callback에 대한 전역 포인터를 사용하여 위의 솔루션을 구현했습니다. set_callback funtion은 C++ 측에서 클래스 생성자로부터 호출됩니다. 이 솔루션과 아래의 테스트에서 동일한 테스트를 통과 할 수있었습니다. 이 솔루션은 클래스의 정적 함수 및 정적 멤버를 갖는 것보다 낫다면 그냥 메모리 사용에 관한 궁금한가요? 목표는 매우 제한된 리소스를 가진 마이크로 컨트롤러에서이 코드를 사용하는 것입니다. 감사합니다. – mgfernandes

+0

정적 멤버는 정의 된 것과 동일한 메모리를 가져야합니다. 그들은 vtptrs에 항목이있을 수 있지만 정직하지 못합니다. 프로세서가 그러한면에서 현명한 메모리라면 아마 순수한 C가 갈 수있는 방법이므로 C 및 C++ 런타임 라이브러리를 모두 포함 할 필요가 없으므로 여기 저기에있는 몇 바이트보다 훨씬 더 많은 메모리 문제가 있습니다 – Chris

0

동시성 관련 문제가 없다고 가정 할 때,이 경우에 대해 알 수없는 간단한 해결책은 정적 인스턴스를 정의하고이를 정적 함수에서 사용할 수 있습니다.

이와 비슷한 것.

에서 MyClass.h

class Object; 

class MyClass 
{ 
public: 
    MyClass(); 
    static Object* object; 
    static void callback(); 
    ~MyClass(); 

}; 

MyClass.cpp를

Object* MyClass::object; 

MyClass::MyClass() 
{ 
    object = new Object(); 
} 

void MyClass::callback() { 
    object->sayHello(); 
} 

MyClass::~MyClass() 
{ 
    delete object; 
} 
+0

정적으로 클래스 멤버를 설정하지 않는 이유는 테스트 목적으로이 클래스의 개체를 만들고 파괴 할 수 있고 테스트 내에서 개체의 상태를 제어 할 수 있기를 원합니다. – mgfernandes

+0

죄송합니다. 어쨌든, 당신은 여전히 ​​객체를 생성하고 파괴 할 수 있으며 테스트 내에서 객체의 상태를 제어 할 수 있습니다. 반원들을 정적으로 정의하는 것이 그것을 막는 이유는 무엇입니까? – perencia

+0

저는 test1에서 하나의 상태 (p.ex. 객체의 ID = 1)가있는 멤버가있는 MyClass를 만들고, 이벤트가 발생하면 콜백이 test2의 멤버 함수를 실행하도록하고 싶습니다. MyClass를 만들고 싶습니다. 멤버가 다른 상태에 있고 (개체의 ID가 5) 콜백이 동일한 멤버 함수를 실행합니다. 필자는 컴파일 타임에 정의 된 상태로 객체를 강제 할 객체를 정적으로 선언한다는 인상하에있었습니다. – mgfernandes