我正在为C++构建一个GUI类,并处理很多指针.一个示例电话:
mainGui.activeWindow->activeWidget->init();
我的问题是我想将activeWidget指针转换为另一种类型. activeWidget的类型为GUI_BASE.派生自BASE我有其他类,如GUI_BUTTON和GUI_TEXTBOX.我想将activeWidget指针从GUI_BASE转换为GUI_TEXTBOX.我认为它看起来像这样:
(GUI_TEXTBOX*)(mainGui.activeWindow->activeWidget)->function();
这不起作用,因为编译器仍然认为指针是GUI_BASE类型.但是,以下位代码确实有效:
GUI_TEXTBOX *textbox_pointer; textbox_pointer = (GUI_TEXTBOX*)mainGui.activeWindow->activeWidget; textbox_pointer->function();
我希望我的问题只是语法问题.谢谢您的帮助 :)
问题是演员阵容的优先级低于. - >()[]运算符.您必须使用C++样式转换或添加额外的括号:
((GUI_TEXTBOX*)mainGui.activeWindow->activeWidget)->function(); // Extra parentheses dynamic_cast(mainGui.activeWindow->activeWidget)->function(); // C++ style cast
你不应该使用C风格的演员表.
您需要使用C++动态转换.这将允许您在调用该方法之前测试该对象实际上是GUI_TEXTBOX.
GUI_TEXTBOX* textboxPointer = dynamic_cast(mainGui.activeWindow->activeWidget); if (textboxPointer) { // If activeWidget is not a text box then dynamic_cast // will return a NULL. textboxPointer->textBoxMethod(); } // or dynamic_cast (*mainGui.activeWindow->activeWidget).textBoxMethod(); // This will throw bad_cast if the activeWidget is not a GUI_TEXTBOX
请注意,C样式转换和reinterpret_cast <>()不能保证在这种情况下工作(虽然在大多数编译器中它们会[但这只是实现的一个方面,你很幸运]).如果分配给activeWidget的对象实际上使用多重继承,则所有投注都会关闭,在这种情况下,如果不使用dynamic_cast <>(),您将开始看到大多数编译器的奇怪错误.