2016-07-02 2 views
0

장치 총칭에서 (잠재적으로 쓸데없는) 시도로 마이크로 컨트롤러 용 내장 라이브러리를 개발하려고합니다. 본질적으로, CallbackStruct이라는 헤더에 struct이 선언되어 있습니다.이 포인터는 UART 객체의 다운 스트림 제어를위한 모든 기능 포인터를 가지고 있습니다 (예 : Arduinos의 Serial 개체).함수 포인터를 생성자에서 전용 변수로 저장

문제는 하나의 함수 포인터를 (특히 구조체에서 참조 해제 할 때) private 변수로 저장되는 다른 포인터로 할당하는 방법을 잘 모르겠다는 것입니다. 본질적으로, 나는 함수 포인터를위한 적절한 C++ 구문을 이해해야한다.

헤더 : 여기에 지금까지 가지고 무엇

class SomeUARTDevice { 
public: 
    struct CallbackStruct { 
     void (*init) (int); 
     void (*xmit) (char *); 
     int  (*recv) (void); 
     int  (*avbl) (void); 
     void (*flsh) (void); 
     void (*kill) (void); 
    }; 

    SomeUARTDevice (struct CallbackStruct *sc); 

private: 
    void (*init_callback) (int); 
    void (*xmit_callback) (char *); 
    int  (*recv_callback) (void); 
    int  (*avbl_callback) (void); 
    void (*flsh_callback) (void); 
    void (*kill_callback) (void); 
} 

그리고, 다음 클래스 소스 :

SomeUARTDevice::SomeUARTDevice (struct CallbackStruct *sc) { 
    init_callback = sc->init; 
} 

이 함수 포인터를 할당하는 적절한 방법이다 (그렇지 않은 경우 , 내가 얼마나 멀리 떨어져 있냐 - 조금씩, 또는 마일 정도)?

다른 구문 boo-boos가있는 경우, 나는 주된 작업 중 혼란없이 문제를 설명하기 위해 예제로 함께 던졌습니다.

+1

당신이 구조체의 복사본을 저장하지 왜 이유가 있습니까? – OnMyLittleDuck

+1

당신이하려는 것은 수동으로 가상 함수를 다시 구현한다는 것입니다. –

+0

@OnMyLittleDuck 구조체는 주로이므로 모든 함수 포인터 참조를 생성자 인수 공간에 넣지 않아도됩니다. 저는 구조체를 직접 호출 할 수 있다고 생각합니다. 그러나 작성 당시에는 그 순열을 거치지 않았습니다. – ecfedele

답변

0

괜찮아 보입니다. 함수 포인터는 다른 포인터처럼 작동합니다.

그러나

는 생성자의 초기화 목록을 사용하여, 직접 멤버를 초기화 할 수 있습니다 :

SomeUARTDevice::SomeUARTDevice(const CallbackStruct *sc) 
    : init_callback(sc->init) 
    , xmit_callback(sc->xmit) 
    // etc 
{} 
관련 문제