我目前正在尝试使用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();
}
(T)a
样式转换,也称为C样式转换,它实际上是在C ++中进行显式转换的最差方法。这是因为它功能最强大-它可以愉快地转换几乎所有内容,并轻松隐藏严重错误。它是C中可用的唯一显式类型转换形式,它是C ++继承的形式,但绝对不应在高质量C ++代码中使用。
的铸造word
到void*
是不必要-任何指针对象类型可以隐式转换的指针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] 删除。
我来说两句