Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我用这个指针投射出了什么问题? 我正在为C++构建一个GUI类,并处理很多指针。一个示例调用: mainGui.activeWindow->activeWidget->init();_C++_Pointers - Fatal编程技术网

我用这个指针投射出了什么问题? 我正在为C++构建一个GUI类,并处理很多指针。一个示例调用: mainGui.activeWindow->activeWidget->init();

我用这个指针投射出了什么问题? 我正在为C++构建一个GUI类,并处理很多指针。一个示例调用: mainGui.activeWindow->activeWidget->init();,c++,pointers,C++,Pointers,我这里的问题是,我想将activeWidget指针转换为另一种类型activeWidget属于GUI\U BASE类型。派生自BASE,我还有其他类,比如GUI_按钮和GUI_文本框。我想将activeWidget指针从GUI\u库转换到GUI\u文本框。我想它看起来是这样的: (GUI_TEXTBOX*)(mainGui.activeWindow->activeWidget)->function(); ((GUI_TEXTBOX*)mainGui.activeWindow->

我这里的问题是,我想将activeWidget指针转换为另一种类型activeWidget属于GUI\U BASE类型。派生自BASE,我还有其他类,比如GUI_按钮和GUI_文本框。我想将activeWidget指针从GUI\u库转换到GUI\u文本框。我想它看起来是这样的:

(GUI_TEXTBOX*)(mainGui.activeWindow->activeWidget)->function();
((GUI_TEXTBOX*)mainGui.activeWindow->activeWidget)->function();
这不起作用,因为编译器仍然认为指针的类型是GUI_BASE。但是,以下代码位确实有效:

GUI_TEXTBOX *textbox_pointer;
textbox_pointer = (GUI_TEXTBOX*)mainGui.activeWindow->activeWidget;
textbox_pointer->function();

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

您只需要更多的括号:

((GUI_TEXTBOX*)(mainGui.activeWindow->activeWidget))->function();
((GUI_TEXTBOX*)mainGui.activeWindow->activeWidget)->function();  // Extra parentheses
dynamic_cast<GUI_TEXTBOX*>(mainGui.activeWindow->activeWidget)->function();  // C++ style cast
实际上,这也会起作用:


问题是强制转换的优先级比()[]操作员。您必须使用C++样式转换或添加额外的括号:

((GUI_TEXTBOX*)(mainGui.activeWindow->activeWidget))->function();
((GUI_TEXTBOX*)mainGui.activeWindow->activeWidget)->function();  // Extra parentheses
dynamic_cast<GUI_TEXTBOX*>(mainGui.activeWindow->activeWidget)->function();  // C++ style cast
((GUI_TEXTBOX*)mainGui.activeWindow->activeWidget)->function();//附加括号
动态_cast(mainGui.activeWindow->activeWidget)->function();//C++风格的演员表
如其他人所述:

((GUI_TEXTBOX*)(mainGui.activeWindow->activeWidget))->function();
原因是
->
运算符的优先级高于类型转换


我将在这里插入另一个来自“实用C”的Steve Oualline规则:

这本书有十五条优先规则 C(&&before | | before ?:). 实用的程序员减少了成本 这些建议包括两项:

1) 乘法和除法来了 在加减法之前

2) 用括号括起来 否则



最后一点注意:降级可能很危险,有关使用
动态\u cast
安全执行强制转换的信息,请参阅。

->的优先级高于(强制转换),因此成员访问在强制转换之前完成。有关运算符优先级,请参见此处:


如上所述,您需要更多的括号。

这是运算符顺序的问题(运算符优先级)。考虑你尝试的代码不起作用:

(GUI_TEXTBOX*)(mainGui.activeWindow->activeWidget)->function()

在这里,
->
运算符的优先级高于您的强制转换。这就是您的其他代码示例工作的原因。在另一个示例中,首先显式强制转换,然后调用函数。要使其更加精简,请尝试添加另一组括号,使代码如下所示:

((GUI_TEXTBOX*)(mainGui.activeWindow->activeWidget))->function()


您不应该使用C样式转换

你需要使用C++动态Casic。这将允许您在调用该对象上的方法之前测试该对象是否实际上是一个GUI_文本框

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
GUI\u TEXTBOX*textboxPointer=dynamic\u cast(mainGui.activeWindow->activeWidget);
if(textboxPointer)
{
//如果activeWidget不是文本框,则动态\u强制转换
//将返回空值。
textboxPointer->textBoxMethod();
}
//或
dynamic_cast(*mainGui.activeWindow->activeWidget).textBoxMethod();
//如果activeWidget不是GUI文本框,则会抛出错误的\u cast
请注意,C风格的cast和reinterpret_cast()不能保证在这种情况下工作(尽管在大多数编译器上,它们会工作[但这只是实现的一个方面,您很幸运])。如果分配给activeWidget的对象实际上使用了多重继承,那么所有的赌注都是无效的。在这种情况下,如果不使用dynamic\u cast(),大多数编译器都会出现奇怪的错误。

if(GUI\u TEXTBOX*ptr=
动态_cast(mainGui.activeWindow->activeWidget))
{
ptr->function();
}

之所以要这样做,是因为您试图强制转换的指针可能实际上并不指向GUI_TEXTBOX对象,并且您希望在调用其上的TEXTBOX方法之前确保它指向GUI_TEXTBOX对象。C++的动态强制转换就是您所需要的

有两种策略。一个是“fail fast”:如果您转换到错误的类型,那么您将抛出一个异常,因此您将立即注意到转换到错误的类型。另一个是“快速运行”:不检查强制转换的目标类型。只有当您知道自己不会错,或者没有基或派生的多态类型时,才应该使用此强制转换。根据您的需要,我推荐以下内容(请记住在您施放时保持常量):


:不执行运行时检查。所以它不会很快失败。相反,如果您强制转换到错误的类型,它将产生未定义的行为。当心

如果GUI_TEXTBOX是从GUI_BASE派生的,那么应该使用dynamic_cast()并进行检查以确保该值不为NULL!很可能OP已经知道这个小部件是一个GUI_文本框——否则,他的原始代码可能会无声地出现故障,并在以后出现奇怪的错误;至少有了dynamic_cast,它会很快失败。对于fail fast,首先取消引用它,然后转换为引用。这样它就会抛出std::bad_cast。现在,对于错误的强制转换,您将得到一个空指针,并且它不会崩溃necassarilyC++风格的提示:所有的大写字母通常保留给预处理器定义。我在一个模板上使用了一个全称的名字,在我的屁股上被鞭打了一次,它仍然很痛。我从C++中学习了C++,并且从Outalin的优先规则中得到了不可估量的好处。记住秘传是傻瓜的事。
dynamic_cast<GUI_TEXTBOX&>(*mainGui.activeWindow->activeWidget).function();
static_cast<GUI_TEXTBOX*>(mainGui.activeWindow->activeWidget)->function();