当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《这个指针演员我做错了什么?》经验,为你挑选了2个好方法。

我正在为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();

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



1> Adam Rosenfi..:

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

((GUI_TEXTBOX*)mainGui.activeWindow->activeWidget)->function();  // Extra parentheses
dynamic_cast(mainGui.activeWindow->activeWidget)->function();  // C++ style cast



2> Martin York..:

你不应该使用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 <>(),您将开始看到大多数编译器的奇怪错误.

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有