2012-12-13 62 views
0

我將如何在類的外部調用自定義代碼,但是從具體對象內調用?例如。如果我想改變對象或類的外部變量的狀態?函子?回調?在繼承的接口中調用自定義代碼?

我是否需要存儲在接口或ADT仿函數或回調?...使用仿函數或回調就是我應該做的假設......

編輯

與functors和模板定義鬥爭整天后,我回到使用函數指針。現在,所有用戶都會註冊一個以前定義的函數名稱,並且會被調用。由於成員變量默認爲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); 
} 
+1

我沒有發現這個問題非常清楚...你是什麼意思的自定義代碼?究竟是什麼阻止你直接在'//..Custom code here'中編寫代碼? – Yaniv

+0

@Yaniv任何不在類內或作爲變量傳入的代碼。重點是我想保持接口的原樣,但是當方法被調用時,對於不同的具體類需要不同的行爲。 – Casey

+1

@Casey - 你基本上是在描述'虛擬'功能..所以它不清楚你想做什麼不同。你能提供一個更具體的例子嗎?如果你想訪問類之外的變量,你需要一種方法來做到這一點,也許將它存儲在'CpuButton'中,但除此之外,不知道你卡在哪裏。 –

回答

1

您可以擁有另一個接口,該接口基於其自己的具體實現提供各種行爲,並通過指向存儲爲成員變量的具體實現的指針調用此接口的方法。當然這是回調。您也可以使用策略模板在編譯時執行此操作。