0

クラスの外部ではなく、具体的なオブジェクト内からカスタム コードを呼び出すにはどうすればよいでしょうか。たとえば、クラスの外部にあるオブジェクトまたは変数の状態を変更したい場合は? 関手?コールバック?

インターフェイスまたはADTにファンクターまたはコールバックを保存する必要がありますか?...ファンクターまたはコールバックを使用することが私がすべきことであると仮定します...

編集

ファンクターとテンプレートの定義と一日中戦った後、関数ポインターの使用に戻りました。ユーザーが行うことは、以前に定義された関数名を登録するだけで、呼び出されます。メンバー変数は、メンバー変数がnullptr登録されていない場合にデフォルトになるため、デフォルトの動作以外は何も起こりません。以下の編集されたコードを参照してください。

ボタン インターフェイス:

class IButton {

public:
    virtual void OnPress() = 0;
    virtual void OnRelease() = 0;
    virtual void OnHover() = 0;
protected:
private:

};

ボタン ADT:

#include "IButton.h"
//..More includes

class ADTButton : public IButton {

public:

    //..Other methods...

    virtual void OnRelease()=0;
    virtual void OnPress()=0;
    virtual void OnHover()=0;
    
    virtual void OnRelease(ADTButton* btn);
    virtual void OnPress(ADTButton* btn);
    virtual void OnHover(ADTButton* btn);

    virtual void RegisterOnReleaseCallback(void (*OnReleaseCallBack)(ADTButton* btn));
    virtual void RegisterOnPressCallback(void (*OnPressCallBack)(ADTButton* btn));
    virtual void RegisterOnHoverCallback(void (*OnHoverCallBack)(ADTButton* btn));

protected:
    
    void (*_OnRelease)(ADTButton* btn);
    void (*_OnPress)(ADTButton* btn);
    void (*_OnHover)(ADTButton* btn);


    //..More Stuff Here in various access modifiers

};

具体的なボタン ヘッダー:

class CpuButton : public ADTButton {
public:

    CpuButton();
    virtual ~CpuButton();

    virtual void OnRelease();
    virtual void OnPress();
    virtual void OnHover();

protected:
private:
};

具体的なボタンの実装:

#include "BTN_CPU.h"
    
void CpuButton::OnRelease() {
    ADTButton::OnRelease();
    if(this->_OnRelease) this->_OnRelease(this);
}

void CpuButton::OnPress() {
    ADTButton::OnPress();
    if(this->_OnPress) this->_OnPress(this);
}

void CpuButton::OnHover() {
    ADTButton::OnHover();
    if(this->_OnHover) this->_OnHover(this);
}
4

1 に答える 1

1

独自の具体的な実装に基づいてさまざまな動作を提供する別のインターフェイスを使用し、メンバー変数として格納されている具体的な実装へのポインターを介してこのインターフェイスのメソッドを呼び出すことができます。これはもちろんコールバックです。ポリシー テンプレートを使用して、コンパイル時にこれを行うこともできます。

于 2012-12-13T03:39:36.490 に答える