这个问题看似微不足道,但我无法解决。
我试图通过将根元素传递给函数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
有人可以解释吗?
答案 0 :(得分:0)
@RemyLebeau评论到位并指出了确切的问题。所以这是解决方案。
问题背景
因此,我有一个指向节点aNode
类型的对象的指针,并具有一个函数insert(Node *node, int x)
。我希望函数insert检查给定的指向节点的指针是否没有指向任何东西,然后创建一个新节点并在提供的节点中设置引用。期望在设置引用aNode
之后也将指向新创建的节点。但是,这是一个错误的期望,因为我通过值而不是引用传递了指针,这意味着函数node
中的insert
与aNode
大型解决方案
因此解决方案是将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