Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 动态/在执行过程中重新定义或添加类成员函数_C++_Function_Dynamic_Definition_Glut - Fatal编程技术网

C++ 动态/在执行过程中重新定义或添加类成员函数

C++ 动态/在执行过程中重新定义或添加类成员函数,c++,function,dynamic,definition,glut,C++,Function,Dynamic,Definition,Glut,嘿,我正在尝试使用SFML制作一个非常简单的GUI,我希望能够在构造函数中为我的Button类附加一个函数,这样用户就可以定义当按下按钮时会发生什么 我以前曾与过剩做过一点工作,并注意到以下方面: glutReshapeFunc(Resize); glutDisplayFunc(Draw); 这显然定义了调整窗口大小或显示窗口时应调用的函数。我希望我的按钮完全像这样,以便在构建时,您可以定义应该调用什么函数我希望能够像glut一样传递函数名,而不必定义包含虚拟函数的新类 不过,我也怀疑是否有

嘿,我正在尝试使用SFML制作一个非常简单的GUI,我希望能够在构造函数中为我的Button类附加一个函数,这样用户就可以定义当按下按钮时会发生什么

我以前曾与过剩做过一点工作,并注意到以下方面:

glutReshapeFunc(Resize);
glutDisplayFunc(Draw);
这显然定义了调整窗口大小或显示窗口时应调用的函数。我希望我的按钮完全像这样,以便在构建时,您可以定义应该调用什么函数我希望能够像glut一样传递函数名,而不必定义包含虚拟函数的新类

  • 不过,我也怀疑是否有可能传递这些参数 调用函数,因为您永远不知道会有多少函数。 我说得对吗

无论如何。。。。。我如何做到这一点或类似的事情??谢谢 >/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