【问题标题】:C++ Passing a Pointer to a Pointer to an Object, cannot access membersC ++将指针传递给指向对象的指针,不能访问成员
【发布时间】:2020-01-30 16:51:18
【问题描述】:

我正在创建一个程序,该程序创建两个对象并通过一个包含许多选项的大菜单向下传递它们。我一直用来将它们作为参数传递的解决方案是创建一个指向对象指针的指针。但是,我遇到了一个问题,如果我使用指向对象的指针作为参数,则会出现编译器错误。显然这里有一个我没有想到的 c++ 约定。

void runMainMenu(Point** ptrPtrPoint)
{
.
.
    *ptrPtrPoint->displayCoord();
.
}

据我所知,这个操作应该是可能的,但这会立即被认为是一个错误“表达式必须具有指向类的类型(当间接运算符与指向指向类的指针)。传递指向对象指针的指针并访问成员函数的正确格式是什么?

【问题讨论】:

  • 尝试使用(*ptrPtrPoint)->displayCoord();。只是猜测。
  • 这不是“C++ 约定”。这是表达式中运算符优先级的规则,并且您(错误地)假设指向指针的指针和指向对象的指针是等价的。 *ptrPtrPoint->displayCoord() 等价于 *(ptrPtrPoint->displayCoord()) 并且表达式 ptrPtrPoint->displayCoord() 没有意义,因为 ptrPtrPoint 指向指针,而不是 Point.. 你需要的是 (*ptrPtrPoint)->displayCoord()。\
  • 只要用void runMainMenu(Point* &refPtrPoint) { refPtrPoint->displayCoord(); }就不用担心refPtrPoint是否为空..
  • @Brandon "那么您不必担心refPtrPoint 是否为空' - 是的,您可以。引用本身不能为空,但它所引用的指针仍然可以为空

标签: c++ class object pointers


【解决方案1】:

您已成为operator precedence 的受害者。

首先取消引用以获取Point*,然后使用->

(*ptrPtrPoint)->displayCoord();

编译器将原始代码读取为

*(ptrPtrPoint->displayCoord()); 

【讨论】:

  • 祝福你,我的朋友。谢谢。
  • @如果这完全回答了您的问题,请考虑 Accepting it 在未来向其他人发出信号,这就是解决方案。
【解决方案2】:

问题在于运算符优先级。

您需要首先取消对指针的引用,然后使用-> 调用该函数。正确的代码行是这样的:

(*ptrPtrPoint)->displayCoord();

注意运算符的优先级,因为在这种情况下,编译器会给你一个错误,但事实并非如此。 有时这些错误会产生未定义的行为或未执行的行为。

【讨论】:

    猜你喜欢
    • 2018-09-03
    • 1970-01-01
    • 2014-01-02
    • 2018-03-24
    • 1970-01-01
    • 2011-05-17
    • 2018-12-07
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多