【问题标题】:Need help with static / non-static members需要静态/非静态成员的帮助
【发布时间】:2010-12-07 00:21:15
【问题描述】:

我有一个如下所示的静态成员函数:

void whackamole_window::showmole(void *){
  if (mtime == 0) {
    Fl::remove_timeout(whackamole_window::showmole);
  }
  else {
    //...

    m(Point(randx*50+25,randy*50+25),randval),
    mb(Point(randx*50,randy*50),50,50,"1",cb_addscore)

    Fl::check();
    Fl::redraw();

    mtime -= 3;
    Fl::repeat_timeout(3, whackamole_window::showmole);
    return;
  }
}

类中的成员函数定义如下

static void showmole(void*);

由于静态成员无法访问该类的任何其他成员(其他静态成员除外),我收到以下错误:

mole111j.cpp:176: 无效使用 成员whackamole_window::m' in static member function mole111j.cpp:177: invalid use of memberwhackamole_window::mb' 在 静态成员函数

如果我尝试使函数非静态,计时器似乎不起作用。那么我该如何解决这个问题并使用计时器访问 m 和 mb 成员?

【问题讨论】:

    标签: c++ fltk


    【解决方案1】:

    我对 FLTK 了解不多,但看起来您的 showMole() 方法传入了 void * 值,您大概可以在启动计时器时指定它。

    如果在启动计时器时提供了指向窗口的指针,则可以将 void * 值强制转换回 whackamole_window * 并使用生成的指针访问非静态成员。

    【讨论】:

    • 请原谅我的新手,但我该怎么做呢?我有点知道如何使用指针,但我不明白你所说的强制转换 void * 是什么意思
    • whackamole_window *thisWindow = (whackamole_window *) argPtr; - 其中 argPtr 是传入方法的 void *。
    【解决方案2】:

    m 和 mb 都是静态变量吗?如果不是,你不能像你一样在静态函数中使用它们。

    将它们设为静态或传入。

    【讨论】:

    • 它们是非静态变量。我怎样才能“把它们传进去”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2013-08-25
    相关资源
    最近更新 更多