C++ 在继承的接口中调用自定义代码?

C++ 在继承的接口中调用自定义代码?,c++,interface,C++,Interface,我如何在类外部调用自定义代码,但从具体对象内部调用?例如,如果我想更改类外部的对象或变量的状态?函子?回电 我需要在接口或ADT中存储函子或回调吗?…假设我应该使用函子或回调 编辑 在与函子和模板定义斗争了一整天之后,我又开始使用函数指针。现在用户所做的就是注册一个以前定义的函数名,然后调用它。由于成员变量默认为nullptr,如果它们不注册一个,那么除了默认行为之外,什么也不会发生。请参见下面编辑的代码 按钮界面: class IButton { public: virtual vo

我如何在类外部调用自定义代码,但从具体对象内部调用?例如,如果我想更改类外部的对象或变量的状态?函子?回电

我需要在接口或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);
}

您可以拥有另一个接口,该接口根据其自身的具体实现提供各种行为,并通过指向存储为成员变量的具体实现的指针调用该接口的方法。这当然是回拨。您还可以使用策略模板在编译时执行此操作

我觉得这个问题不是很清楚。。。你所说的自定义代码是什么意思?到底是什么阻止您直接在
/…此处调用的自定义代码中编写代码?@Yaniv任何不在类内或作为变量传入的代码。关键是,我希望保持接口的原样,但希望在调用方法时对不同的具体类有不同的行为。@Casey-您基本上是在描述
virtual
函数。。所以不清楚你想做什么不同。你能提供一个更具体的例子吗?如果您想访问类外的变量,您需要一种方法来实现这一点,也许可以将其存储在
CpuButton
中,但除此之外,您还不确定自己的位置。您可以提供一种方法,该方法接受并存储在触发事件时应回调的函数。