C++ 动态/在执行过程中重新定义或添加类成员函数
嘿,我正在尝试使用SFML制作一个非常简单的GUI,我希望能够在构造函数中为我的Button类附加一个函数,这样用户就可以定义当按下按钮时会发生什么 我以前曾与过剩做过一点工作,并注意到以下方面:C++ 动态/在执行过程中重新定义或添加类成员函数,c++,function,dynamic,definition,glut,C++,Function,Dynamic,Definition,Glut,嘿,我正在尝试使用SFML制作一个非常简单的GUI,我希望能够在构造函数中为我的Button类附加一个函数,这样用户就可以定义当按下按钮时会发生什么 我以前曾与过剩做过一点工作,并注意到以下方面: glutReshapeFunc(Resize); glutDisplayFunc(Draw); 这显然定义了调整窗口大小或显示窗口时应调用的函数。我希望我的按钮完全像这样,以便在构建时,您可以定义应该调用什么函数我希望能够像glut一样传递函数名,而不必定义包含虚拟函数的新类 不过,我也怀疑是否有
glutReshapeFunc(Resize);
glutDisplayFunc(Draw);
这显然定义了调整窗口大小或显示窗口时应调用的函数。我希望我的按钮完全像这样,以便在构建时,您可以定义应该调用什么函数我希望能够像glut一样传递函数名,而不必定义包含虚拟函数的新类
- 不过,我也怀疑是否有可能传递这些参数 调用函数,因为您永远不知道会有多少函数。 我说得对吗
无论如何。。。。。我如何做到这一点或类似的事情??谢谢在C++中,强> >/p>最好使用<代码>虚拟<代码>函数方法来解决此类问题。从长远来看,这更易于维护 您可以选择对代码重新设计一点,这样就可以对各种子类有一个公共句柄。现在,根据所选的子类,您可以调用特定的函数。例如:
class Shape
{
public:
virtual void Resize () = 0;
virtual void Draw () = 0;
};
class Triangle : public Shape
{
public:
// implement above to functions
};
class Square : public Shape
{
public:
// implement above to functions
};
现在,只要将Shape*
的句柄传递到任何需要的地方,并调用上述抽象方法
void foo(Shape *p)
{
p->Resize();
}
(重写了所有内容),我误读了问题
您似乎希望将普通的旧函数指针传递给其他函数。您所需要做的只是传递所需函数的名称,但在if
(或类似内容)中传递,这样传递的函数实际上就是您想要的:
if(i am feeling lucky today){
glutDisplayFunc(DrawMyLuckyShape);
}else{
glutDisplayFunc(DrawAFoo);
}
坏消息是,由于C是一种讨厌的语言,您无法设置为向函数传递额外的参数(即,使用闭包)。因此,您需要依赖于a)正在传递的函数、正在调用的参数或b)正在查看某个全局状态的函数。您可以使用例如
std::function
存储回调(对于C++0x;boost::function
也可用,并且具有类似的接口)
#包括
类按钮{
公众:
模板
明确的
按钮(T const&T):回调(T){
无效的
新闻界()
{
回调();
}
私人:
函数回调;
};
//示例使用lambda
按钮b([]{do_stuff();});
b、 按();//我会打电话给你的
Haha,我们程序员可能需要从这些旧的形状+动物的OOP示例中继续前进是的,这是一种方法,但是你知道过量是如何做到的吗?在这里,您必须定义一个全新的类,使用glut,您只需要传递已定义函数的名称。“我该怎么做?”格里芬,不知道。也许你可以编辑你的问题,给出你想要的最简单的代码示例。@missingo汽车怎么样。。。还有什么没用过。。。哦,是的!是的,这是一种方法,但你知道过剩是如何产生的吗?在这里,您必须定义一个全新的类,使用glut,您只需要传递已定义函数的名称。我该怎么做呢?忘了类吧,刚刚意识到过量显然是普通的C语言。主要是坏消息,因此,你想做什么,更具体地说,GLUT完全是C,没有C++。您可以将源代码下载到“freeglut”中,看看它是如何实现的,它只存储了您传递给它的几个函数指针。boost是如何实现这一点的呢?例如:通过虚拟函数?@Griffin使用虚拟函数是一种可能性,但不是唯一的方法。这种技术被称为类型擦除,并因此而被称为类型擦除。话虽如此,我还是建议不要重新发明std::function
。不过,为了学习,不妨尝试一下。
#include <functional>
class Button {
public:
template<typename T>
explicit
Button(T const& t): callback(t) {}
void
press()
{
callback();
}
private:
std::function<void()> callback;
};
// example use with a lambda
Button b([] { do_stuff(); });
b.press(); // will call do_stuff