类型转换/回调函数

爱德华·杰基尔

我目前正在尝试使用FLTK GUI库,但不能真正确定回调函数的功能-特别是类型转换对我来说有点陌生。下面的示例显示了一个基本窗口,其中带有一个标记为“ Press”的按钮。当您按下按钮时,标签将变为“完成”。

传递给回调函数的标签被声明为type const char*,然后将其强制转换为type void*,但是可以将其声明为astd::string并强制转换为void*吗?我更喜欢使用现代C ++字符串而不是char符号。

另外,下面的语法是从一种类型转换为另一种类型的最佳方法吗?我以前看过static_cast<type>()用过,但是从const char*void*,反之亦然的最安全/最佳方法是什么?为什么?C ++ 11会推荐什么?

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Native_File_Chooser.H>
#include <string>

void xyz_callback(Fl_Widget* w, void* userdata)
{

  Fl_Button* b = (Fl_Button*)w; //cast widget w to button and assign to b

  b->label((const char*)userdata);  //cast userdata back to type const char*
}


int main(int argc, char **argv)
{
  Fl_Window *window = new Fl_Window(340,180);
  Fl_Button *button = new Fl_Button(20,40,300,100, "label");
  button->label("Press");
  button->labelfont(FL_BOLD+FL_ITALIC);
  button->labelsize(36);
  button->labeltype(FL_SHADOW_LABEL);
  button->when(FL_WHEN_RELEASE);

  const char* word = "Done";
  button->callback(xyz_callback, (void*)word); //cast word to type void*

  window->end();
  window->show(argc, argv);
  return Fl::run();
}
Angew不再为SO感到骄傲

(T)a样式转换,也称为C样式转换,它实际上是在C ++中进行显式转换最差方法。这是因为它功能最强大-它可以愉快地转换几乎所有内容,并轻松隐藏严重错误。它是C中可用的唯一显式类型转换形式,它是C ++继承的形式,但绝对不应在高质量C ++代码中使用。

的铸造wordvoid*是不必要-任何指针对象类型可以隐式转换的指针void

演员回到const char*回调是必要的,但可以用一个来完成static_cast<const char*>(userdata)

要解决有关std::string的问题,这取决于生命周期。您可以将a转换std::string*为avoid*并将其传递给回调。在其中,您将其投射回str::string*(然后c_str()从中检索以传递给label函数)。但是您必须确保std::string在调用回调时指向的指针仍然有效(没有超出范围)。如果在中将其设为局部变量main,则非常安全。

如果以这种方式执行,代码将如下所示:

void xyz_callback(Fl_Widget* w, void* userdata)
{
  Fl_Button* b = static_cast<Fl_Button*>(w);

  b->label(static_cast<std::string*>(userdata)->c_str());
}


int main(int argc, char **argv)
{
  Fl_Window *window = new Fl_Window(340,180);
  Fl_Button *button = new Fl_Button(20,40,300,100, "label");
  button->label("Press");
  button->labelfont(FL_BOLD+FL_ITALIC);
  button->labelsize(36);
  button->labeltype(FL_SHADOW_LABEL);
  button->when(FL_WHEN_RELEASE);

  std::string word = "Done";
  button->callback(xyz_callback, &word);

  window->end();
  window->show(argc, argv);
  return Fl::run();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章