【问题标题】:FLTK button callback gives c3867FLTK 按钮回调给 c3867
【发布时间】:2015-12-22 17:44:42
【问题描述】:

我试图用我以前尝试过的方法将函数分配给一个按钮,该方法以前也有效,但由于某种原因,我现在从我的编译器中得到了这个:

错误 C3867:“WindowReq::calc_cb”:非标准语法;使用“&”来 创建一个指向成员的指针

代码如下:

class WindowReq : public Fl_Window
{
public:
    WindowReq(int W, int H, const char* Title);

    Fl_Input*   InVel;
    Fl_Input*   InDeg;
    Fl_Button*  Calc;


private:
    void calc_cb(Fl_Widget* o, void* v);

};



WindowReq::WindowReq(int W, int H, const char* Title) : Fl_Window(W, H, Title)
{
    begin();
        Calc = new Fl_Button((WINSIZE - 150), 50, 100, 30, "Calculate path");
        Calc->callback(calc_cb, this);

        InVel = new Fl_Input(70, 50, 100, 30, "Velocity:");

        InDeg = new Fl_Input(((WINSIZE / 3) + 50), 50, 100, 30, "Angle:");
    end();


    show();
}

我不知道问题出在哪里,我们将不胜感激。

编辑:根据 VisualStudio,这是导致错误的行:

Calc->callback(calc_cb, this);

【问题讨论】:

  • this 指的是类而不是类方法。所以你应该找到其他方法来做到这一点。
  • 它应该指向类,这样我就可以让其中的小部件毫不费力地进行通信。无论如何,取出“this”并不能使其编译。

标签: c++ fltk


【解决方案1】:

你不能像这样调用实例化方法。
该函数必须依赖于类的实例。

所以,基本上你有多种选择来解决这个问题,但由于你将this 作为第二个参数传递,我猜你只是在calc_cb 的声明之前忘记了static 关键字。

那么调用应该是这样的:

Calc->callback(&WindowReq::calc_cb, this);

其他方法包括使用模板化回调或 C++11 的 lambda,它们可以直接在实例化类中调用方法。可能还有更多方法可以实现这一目标。

【讨论】:

  • 恐怕我听不懂。我还没有在 C++ 方面做过很多事情(首先学习了 C,C++ 是我学习的第二语言)。为什么我应该将calc_cb 声明为静态,&WindowReq 甚至可以做什么?
  • @Neko 我很想向您解释这一点,但我担心它过于宽泛,无法在 cmets 中解释。而是在互联网上搜索“c++ 静态成员函数”,& 号告诉编译器直接从中获取表达式的地址,简而言之 - &WindowReq::calc_cb 获取类 WindowReq 中方法 calc_cb 的地址。
  • 我会听从您对 google 的建议,但是您将 calc_cb 声明为静态并按照您的建议重写该行的建议只会增加我得到的错误数量。而不是如何修复它,也许更好的问题是为什么它首先不起作用。这里有一个类似的例子:link
  • @Neko 您发布的 sn-p 为我工作。有什么错误?
  • "error C2227: left of '->value' must point to class/struct/union/generic type" 我刚刚注意到新的错误现在在calc_cb的定义中。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 2015-05-17
  • 2015-05-21
  • 2013-12-25
相关资源
最近更新 更多