这个指针演员我做错了什么?

sin*_*oth 3 c++ pointers

我正在为C++构建一个GUI类,并处理很多指针.一个示例电话:

mainGui.activeWindow->activeWidget->init();
Run Code Online (Sandbox Code Playgroud)

我的问题是我想将activeWidget指针转换为另一种类型. activeWidget的类型为GUI_BASE.派生自BASE我有其他类,如GUI_BUTTON和GUI_TEXTBOX.我想将activeWidget指针从GUI_BASE转换为GUI_TEXTBOX.我认为它看起来像这样:

(GUI_TEXTBOX*)(mainGui.activeWindow->activeWidget)->function();
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为编译器仍然认为指针是GUI_BASE类型.但是,以下位代码确实有效:

GUI_TEXTBOX *textbox_pointer;
textbox_pointer = (GUI_TEXTBOX*)mainGui.activeWindow->activeWidget;
textbox_pointer->function();
Run Code Online (Sandbox Code Playgroud)

我希望我的问题只是语法问题.谢谢您的帮助 :)

Ada*_*eld 18

问题是演员阵容的优先级低于. - >()[]运算符.您必须使用C++样式转换或添加额外的括号:

((GUI_TEXTBOX*)mainGui.activeWindow->activeWidget)->function();  // Extra parentheses
dynamic_cast<GUI_TEXTBOX*>(mainGui.activeWindow->activeWidget)->function();  // C++ style cast
Run Code Online (Sandbox Code Playgroud)


Mar*_*ork 9

你不应该使用C风格的演员表.

您需要使用C++动态转换.这将允许您在调用该方法之前测试该对象实际上是GUI_TEXTBOX.

GUI_TEXTBOX* textboxPointer  = dynamic_cast<GUI_TEXTBOX*>(mainGui.activeWindow->activeWidget);
if (textboxPointer)
{
     // If activeWidget is not a text box then dynamic_cast
     // will return a NULL.
     textboxPointer->textBoxMethod();
}

// or 

dynamic_cast<GUI_TEXTBOX&>(*mainGui.activeWindow->activeWidget).textBoxMethod();

// This will throw bad_cast if the activeWidget is not a GUI_TEXTBOX
Run Code Online (Sandbox Code Playgroud)

请注意,C样式转换和reinterpret_cast <>()不能保证在这种情况下工作(虽然在大多数编译器中它们会[但这只是实现的一个方面,你很幸运]).如果分配给activeWidget的对象实际上使用多重继承,则所有投注都会关闭,在这种情况下,如果不使用dynamic_cast <>(),您将开始看到大多数编译器的奇怪错误.