2016-07-02 8 views
0

私は、デバイスの一般的なもので、(潜在的に無益な)試みでマイクロコントローラ用の組み込みライブラリを開発しようとしています。本質的に、私は(ただ一つの潜在的使用を指摘するために、Arduinosの即ちSerialオブジェクト)UARTオブジェクトの下り制御するための機能ポインタの全体の束を有するCallbackStructと呼ばれるヘッダで宣言さstructを有します。プライベート変数にコンストラクタから関数ポインタを格納する

問題は、私はプライベート変数として格納されている別の(構造体から間接参照特に)1つの関数ポインタを割り当てる方法はかなりよく分からないということです。基本的には、関数ポインタのための適切な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; 
} 

が、これは関数ポインタを割り当てるための適切な方法である(そうでない場合、私はどれくらい離れていますか - 少し、またはマイルで)?他の構文ブーイング、ブーイングがあることが起こるならば、私はすぐにメインの作業中の混乱せずに問題を実証するための一例として、一緒にこれを投げたことを

は注意してください。正常に見える

+1

あなたは、構造体のコピーを保存したくない理由はありますか? – OnMyLittleDuck

+1

あなたがやろうとしていることは、仮想関数を手動で再実装することです。 –

+0

@OnMyLittleDuck構造体は主に、すべての関数ポインタ参照をコンストラクタ引数空間にジャムする必要はありません。私は構造体を直接呼び出すことができると思いますが、文章の時点ではその順列で作業していませんでした。 – ecfedele

答えて

0

。関数ポインタは他のポインタと同様に動作します。

しかし

あなたは、コンストラクタの初期化リストを使用して、直接あなたのメンバーを初期化することができることに注意してください:

SomeUARTDevice::SomeUARTDevice(const CallbackStruct *sc) 
    : init_callback(sc->init) 
    , xmit_callback(sc->xmit) 
    // etc 
{} 
関連する問題