gpt4 book ai didi

c++ - 在继承的接口(interface)中调用自定义代码?

转载 作者:行者123 更新时间:2023-11-28 07:50:42 26 4
gpt4 key购买 nike

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

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

最佳答案

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

关于c++ - 在继承的接口(interface)中调用自定义代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13852318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com