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