传递和转换方法指针
passing and casting method pointers
我努力创建派生的 classes 并将方法指针从它传递到基础 class,以便在基础 class 中声明的函数可以调用它(调用函数通过接口派生的class)。
目标是创建派生的 classes 以带来它们自己的资源和函数,但是通过在基函数中调用其中之一来调用声明在那里的函数应该是可能的 class 提供。为此,我需要将派生的成员函数指针传递给基 class。
这是我尝试过的:
class KeyFunction
{
void(*KeyFunction::KeyFuncPtr)() = nullptr; //pointer to a method of this class to store standard behavior for call
public:
KeyFunction(void(*KeyFunction::KeyFunc)()) : KeyFuncPtr(KeyFunc) {} //constructor which takes in standard behavior
void func() //standard call of the function
{
if(KeyFuncPtr)KeyFuncPtr(); //call with ensurance there's something to be called
}
void operator()() //make KeyFunction class callable
{
func();
}
};
class customRessource{
public:
string up = "UP";
string down = "DOWN";
};
class customKeyFunc : public KeyFunction
{
customRessource& r;
public:
void moveup() //possible behavior
{
cout << r.up;
}
void movedown()
{
cout << r.down;
}
customKeyFunc( void(*customKeyFunc::KeyFunc)() ) :KeyFunction( ( void(*KeyFunction::)() ) (KeyFunc) ){}
};
int main()
{
customKeyFunc Up(&(customKeyFunc::moveup)); //setup functions
customKeyFunc Down(&customKeyFunc::movedown);
Up(); //call functions
Down();
getchar();
return 0;
}
最后的 main 函数显示了使用 class 的假定方式。
首先:我在每个 class 的构造函数中的类型变得疯狂(我尝试了很多关于如何正确编写成员指针的搜索,但我仍然对语法不稳定)
有人可以帮我改正吗?
我什至可以这样做吗(特别是像我在 customKeyFunc 构造函数中那样强制转换成员指针)?我是在以正确的方式处理这个问题还是我认为太复杂了?
提前感谢您的帮助!
是这样的吗?
#include <functional>
#include <string>
#include <iostream>
class customResource{
public:
const std::string up = "UP";
const std::string down = "DOWN";
};
class customKeyFunc
{
const customResource& r;
public:
customKeyFunc(const customResource& r) : r(r) {}
void moveup() //possible behavior
{
std::cout << r.up;
}
void movedown()
{
std::cout << r.down;
}
};
int main()
{
customResource r;
customKeyFunc f(r);
auto Up = std::function<void()>(std::bind(&customKeyFunc::moveup, f));
auto Down = std::function<void()>(std::bind(&customKeyFunc::movedown, f));
Up(); //call functions
Down();
return 0;
}
std::function<void()>
是一个多态仿函数,它将复制任何对象:
可移动或可复制,并且
实施void operator()
我努力创建派生的 classes 并将方法指针从它传递到基础 class,以便在基础 class 中声明的函数可以调用它(调用函数通过接口派生的class)。
目标是创建派生的 classes 以带来它们自己的资源和函数,但是通过在基函数中调用其中之一来调用声明在那里的函数应该是可能的 class 提供。为此,我需要将派生的成员函数指针传递给基 class。
这是我尝试过的:
class KeyFunction
{
void(*KeyFunction::KeyFuncPtr)() = nullptr; //pointer to a method of this class to store standard behavior for call
public:
KeyFunction(void(*KeyFunction::KeyFunc)()) : KeyFuncPtr(KeyFunc) {} //constructor which takes in standard behavior
void func() //standard call of the function
{
if(KeyFuncPtr)KeyFuncPtr(); //call with ensurance there's something to be called
}
void operator()() //make KeyFunction class callable
{
func();
}
};
class customRessource{
public:
string up = "UP";
string down = "DOWN";
};
class customKeyFunc : public KeyFunction
{
customRessource& r;
public:
void moveup() //possible behavior
{
cout << r.up;
}
void movedown()
{
cout << r.down;
}
customKeyFunc( void(*customKeyFunc::KeyFunc)() ) :KeyFunction( ( void(*KeyFunction::)() ) (KeyFunc) ){}
};
int main()
{
customKeyFunc Up(&(customKeyFunc::moveup)); //setup functions
customKeyFunc Down(&customKeyFunc::movedown);
Up(); //call functions
Down();
getchar();
return 0;
}
最后的 main 函数显示了使用 class 的假定方式。
首先:我在每个 class 的构造函数中的类型变得疯狂(我尝试了很多关于如何正确编写成员指针的搜索,但我仍然对语法不稳定) 有人可以帮我改正吗?
我什至可以这样做吗(特别是像我在 customKeyFunc 构造函数中那样强制转换成员指针)?我是在以正确的方式处理这个问题还是我认为太复杂了?
提前感谢您的帮助!
是这样的吗?
#include <functional>
#include <string>
#include <iostream>
class customResource{
public:
const std::string up = "UP";
const std::string down = "DOWN";
};
class customKeyFunc
{
const customResource& r;
public:
customKeyFunc(const customResource& r) : r(r) {}
void moveup() //possible behavior
{
std::cout << r.up;
}
void movedown()
{
std::cout << r.down;
}
};
int main()
{
customResource r;
customKeyFunc f(r);
auto Up = std::function<void()>(std::bind(&customKeyFunc::moveup, f));
auto Down = std::function<void()>(std::bind(&customKeyFunc::movedown, f));
Up(); //call functions
Down();
return 0;
}
std::function<void()>
是一个多态仿函数,它将复制任何对象:
可移动或可复制,并且
实施
void operator()