无法通过指针访问对象的成员

时间:2018-10-10 00:03:54

标签: c++ pointers

这个问题看似微不足道,但我无法解决。

我试图通过将根元素传递给函数exec("osascript /path/to/applescript " + cellNum); 来添加节点。该函数首先检查当前根是否为空,如果是,则仅创建一个新节点并将其设置为根。我的第一次尝试是这样的

insert

这当然是行不通的,因为我按值传递了指针,这导致#include <iostream> using namespace std; class Node { public: int data; Node(int x) { data = x; } }; void insert(Node *node, int x) { cout << &node << "\n"; if(node == NULL) { node = new Node(x); } } int main () { Node *aNode; aNode = NULL; insert(aNode, 8); cout << aNode << "\n"; return 0; } 仍然是aNode,并且经过一番搜索之后,我知道我需要按引用传递指针,第二次尝试是这样的

NULL

现在,由于#include <iostream> using namespace std; class Node { public: int data; Node(int x) { data = x; } }; void insert(Node **node, int x) { if(*node == NULL) { *node = new Node(x); cout << *node->data << "\n"; //gives error but program runs fine without it } } int main () { Node *aNode; aNode = NULL; insert(&aNode, 8); cout << aNode->data << "\n"; return 0; } 中的cout打印了cout,所以插入函数中没有main了,这是我想要的,但是编译器在出现错误8的同时在插入的request for member 'data' in '* node', which is of pointer type 'Node*' (maybe you meant to use '->' ?)处。我按如下所示更改了插入内容以运行一些测试,结果令人困惑

cout

有人可以解释吗?

1 个答案:

答案 0 :(得分:0)

@RemyLebeau评论到位并指出了确切的问题。所以这是解决方案。

问题背景

因此,我有一个指向节点aNode类型的对象的指针,并具有一个函数insert(Node *node, int x)。我希望函数insert检查给定的指向节点的指针是否没有指向任何东西,然后创建一个新节点并在提供的节点中设置引用。期望在设置引用aNode之后也将指向新创建的节点。但是,这是一个错误的期望,因为我通过值而不是引用传递了指针,这意味着函数node中的insertaNode

不同

大型解决方案

因此解决方案是将aNode的引用传递给函数insert。因此,我将函数调用更改为insert

insert(&aNode, 8);

并将insert的函数定义更改为此

void insert(Node **node, int x)

这解决了问题,因为**node现在已被引用到aNode的地址,而我能够通过简单地将node引用为*node来获得其值。当我尝试通过Node访问*node->data的成员时发生了问题。原因是*->实际上是运算符,并且->的优先级高于*。因此,在评估*node->data时,它实际上是以*(node->data)的方式执行的,这意味着编译器实际上是在尝试取消引用node->data而不是node的引用。快速的解决方案就是访问像这样的数据(* node)-> data。

正确的解决方案

尽管通过括号,我能够实现所需的行为,但是语法很丑陋。正确的解决方案@ pm100指出在函数定义中使用引用,而不是对其进行两次解引用,这意味着声明这样的函数

void insert(Node *&node, int x)

而不是这样

void insert(Node **node, int x)

启用访问节点成员的方式就像node->data而不是(*node)->data

如果您不熟悉像我这样的指针,请注意https://www.youtube.com/watch?v=Rxvv9krECNw