मैं वर्तमान में FLTK जीयूआई पुस्तकालय के साथ प्रयोग कर रहा हूँ, लेकिन वास्तव में यकीन है कि क्या कॉलबैक कार्यों — साथ चल रहा है नहीं कर रहा हूँ विशेष रूप से प्रकार कास्टिंग सामान थोड़ा मेरे लिए विदेशी है। नीचे दिया गया उदाहरण "प्रेस" लेबल वाले बटन के साथ एक मूल विंडो दिखाता है। जब आप बटन दबाते हैं तो लेबल "हो गया" में बदल जाता है।प्रकार कास्टिंग/कॉलबैक कार्य
लेबल कि कॉलबैक फ़ंक्शन पर पारित हो जाता है प्रकार const char*
के रूप में घोषित किया जाता है और फिर इसे टाइप करने के लिए void*
डाली है, लेकिन यह एक std::string
के रूप में इस घोषणा करने के लिए संभव है और फिर void*
लिए डाली? मैं char
नोटेशन से आधुनिक सी ++ तारों का उपयोग करना पसंद करता हूं।
इसके अलावा, है एक प्रकार से दूसरे में कास्टिंग का सबसे अच्छा तरीका नीचे वाक्य रचना? मैं static_cast<type>()
देखा है पहले इस्तेमाल किया लेकिन क्या सबसे सुरक्षित/सबसे अच्छा void*
या ठीक इसके विपरीत है और क्यों करने के लिए const char*
से एक डाली करने के लिए तरीका है? सी ++ 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();
}
लेकिन यह एक std :: स्ट्रिंग के रूप में घोषित करने के लिए संभव है और फिर कास्ट करने के लिए "शून्य *"? हाँ। –
@ BartekBanachewicz क्या आप std :: string या std :: string पर पॉइंटर डालना चाहते हैं? – harper
ठीक है, इसके लिए एक सूचक। –