2012-12-13 1 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 called here'에 직접 코드를 작성하는 것을 막을 수있는 것은 무엇입니까? – Yaniv

+0

@ Yaniv 클래스 내에 없거나 변수로 전달 된 코드입니다. 요점은 인터페이스를 그대로 유지하려고하지만 메서드가 호출 될 때 다른 구체적인 클래스에 대해 다른 동작을 원한다는 것입니다. – Casey

+1

@Casey - 당신은 기본적으로'가상'함수를 설명하고 있습니다. 그래서 당신이 원하는 것을 분명히하지 않습니다. 보다 구체적인 예를 제시 할 수 있습니까? 클래스 외부의 변수에 접근하고 싶다면, 그것을 할 수있는 방법이 필요합니다. 아마도'CpuButton'에 저장할 수 있습니다. –

답변

1

자체 구현에 따라 다양한 동작을 제공하는 다른 인터페이스를 가질 수 있으며 멤버 변수로 저장된 구체적인 구현에 대한 포인터를 통해이 인터페이스의 메서드를 호출 할 수 있습니다. 이것은 물론 콜백입니다. 정책 템플릿을 사용하여 컴파일 타임에이를 수행 할 수도 있습니다.

관련 문제