在我展示这篇文章底部的代码之前,我想谈谈我不想要的问题和修复。好的,基本上我已经从头开始创建了一个 GUI,我想要的一个要求是允许组件有自己的点击执行,所以如果我点击一个按钮或选项卡等。它会调用 Component->Execute(); 好吧,通常你会做类似 id 的 switch 语句,如果组件 ID 等于 n 个数字,那么它将执行此操作。好吧,这对我来说似乎有点愚蠢,我认为必须有更好的方法。我最终尝试在 JAVA 中加入一个功能,你会喜欢 Component.AddActionListener(new ActionListener( public void execute(ActionEvent ae) { })); 或类似的东西,我认为这个功能必须在 C++ 中成为可能。我最终遇到了将 void 函数存储到一个变量中,该变量可以随时执行并随时修改。但是我没有注意到一个问题,那就是这只适用于静态函数。所以下面你会看到我的问题。我已经通过使用指向 SomeClass 的指针解决了这个问题,但这意味着对每个类类型都有一个单独的函数调用,如果不执行以下策略,就没有办法将函数回调存储到非静态类成员吗?而是做一个像注释掉的代码这样的策略?已经通过使用指向 SomeClass 的指针解决了这个问题,但这意味着对每个类类型都有一个单独的函数调用,如果不执行以下策略,是否无法将函数回调存储到非静态类成员?而是做一个像注释掉的代码这样的策略?已经通过使用指向 SomeClass 的指针解决了这个问题,但这意味着对每个类类型都有一个单独的函数调用,如果不执行以下策略,是否无法将函数回调存储到非静态类成员?而是做一个像注释掉的代码这样的策略?
//main.cpp
#include <iostream> //system requires this.
#include "SomeClass.h"
void DoSomething1(void)
{
std::cout << "We Called Static DoSomething1\n";
}
void DoSomething2(void)
{
std::cout << "We Called Static DoSomething2\n";
}
int main()
{
void (*function_call2)(SomeClass*);
void (*function_call)() = DoSomething1; //This works No Problems!
function_call(); //Will Call the DoSomething1(void);
function_call = DoSomething2; //This works No Problems!
function_call(); //Will Call the DoSomething2(void);
SomeClass *some = new SomeClass(); //Create a SomeClass pointer;
function_call = SomeClass::DoSomething3; //Static SomeClass::DoSomething3();
function_call(); //Will Call the SomeClass::DoSomething3(void);
//function_call = some->DoSomething4; //Non-Static SomeClass::DoSomething4 gives an error.
//function_call(); //Not used because of error above.
function_call2 = SomeClass::DoSomething5; //Store the SomeClass::DoSomething(SomeClass* some);
function_call2(some); //Call out SomeClass::DoSomething5 which calls on SomeClass::DoSomething4's non static member.
system("pause");
return 0;
}
//SomeClass.hpp
#pragma once
#include <iostream>
class SomeClass
{
public:
SomeClass();
~SomeClass();
public:
static void DoSomething3(void);
void DoSomething4(void);
static void DoSomething5(SomeClass* some);
};
//SomeClass.cpp
#include "SomeClass.h"
SomeClass::SomeClass(void)
{
}
SomeClass::~SomeClass(void)
{
}
void SomeClass::DoSomething3(void)
{
std::cout << "We Called Static DoSomething3\n";
}
void SomeClass::DoSomething4(void)
{
std::cout << "We Called Non-Static DoSomething4\n";
}
void SomeClass::DoSomething5(SomeClass *some)
{
some->DoSomething4();
}
二级修复我不会做一个我想要的确切答案,但它现在满足我的需求,同时允许额外的功能,如果这不存在,这些功能将变得过于复杂。
//组件.hpp
#pragma once
#include <iostream>
#include <windows.h>
#include <d3dx9.h>
#include <d3d9.h>
#include "Constants.hpp"
#include "ScreenState.hpp"
#include "ComponentType.hpp"
using namespace std;
class Component
{
static void EMPTY(void) { }
static void EMPTY(int i) { }
public:
Component(void)
{
callback = EMPTY;
callback2 = EMPTY;
callback_id = -1;
}
Component* SetFunction(void (*callback)())
{
this->callback = callback;
return this;
}
Component* SetFunction(void (*callback2)(int), int id)
{
this->callback_id = id;
this->callback2 = callback2;
return this;
}
void execute(void)
{
callback();
callback2(callback_id);
}
}