C++ 如何在main中调用包含节点引用的函数

C++ 如何在main中调用包含节点引用的函数,c++,pointers,wrapper,pass-by-reference,nodes,C++,Pointers,Wrapper,Pass By Reference,Nodes,我很好奇如何实现这样一个功能。比如说, 我有点像: class Node { public: int dataItem; Node *next; }; void foo(int number, Node & n) { // do something } 然后我主要需要调用该函数,类似这样的函数不起作用: int main () { Node *n; int data; foo(data, n); return 0; } 我需要一个包装器函数,以便在main中通过引用传递节点,而这正

我很好奇如何实现这样一个功能。比如说,

我有点像:

class Node {
public:
int dataItem;
Node *next;
};

void foo(int number, Node & n) {
// do something
}
然后我主要需要调用该函数,类似这样的函数不起作用:

int main () {
Node *n;
int data;
foo(data, n);
return 0;
}

我需要一个包装器函数,以便在main中通过引用传递节点,而这正是我努力的地方,我只是不确定如何解决这个问题。我尝试了一些想法,在网上读了很多书,但我就是没能领会。理解如何实现这个包装器函数的任何帮助都将是非常棒的

您根本没有
节点。您只有一个指向
节点
的指针,它还没有指向任何特定的地方(您的
数据
也未初始化)。类型为
节点&
的引用参数要求您传递一个
节点
,而不是
节点*
,因此您真正需要的是:

int main() {
  Node n;
  int data = 0;
  foo(data, n); // Pass the Node directly
  return 0;
}
或者,如果确实需要
n
作为指针,可以执行以下操作:

int main() {
  Node* n = new Node();
  int data = 0;
  foo(data, *n); // Dereference n to get the Node it points to
  delete n;
  return 0;
}

但是,我不主张在这种情况下使用原始指针-您必须记住
删除
以避免内存泄漏。您可以使用
std::unique_ptr n(new Node())
而不是
Node*n=new Node()
,但是使用具有自动存储持续时间的
节点(如第一个示例中所示)更为可取。

您根本没有
节点。您只有一个指向
节点
的指针,它还没有指向任何特定的地方(您的
数据
也未初始化)。类型为
节点&
的引用参数要求您传递一个
节点
,而不是
节点*
,因此您真正需要的是:

int main() {
  Node n;
  int data = 0;
  foo(data, n); // Pass the Node directly
  return 0;
}
或者,如果确实需要
n
作为指针,可以执行以下操作:

int main() {
  Node* n = new Node();
  int data = 0;
  foo(data, *n); // Dereference n to get the Node it points to
  delete n;
  return 0;
}

但是,我不主张在这种情况下使用原始指针-您必须记住
删除
以避免内存泄漏。您可以使用
std::unique\u ptr n(new Node())
而不是
Node*n=new Node()
,但更倾向于使用具有自动存储持续时间的
节点(如第一个示例中所示)。

您的函数
foo
引用了
节点,但您正在向其传递指针。例如,更改
main()
中的函数或代码

int main () {
Node n;
int data; // beware, may contain garbage value.
foo(data, n);
return 0;
}


您的函数
foo
引用了
节点
,但您正在向其传递指针。例如,更改
main()
中的函数或代码

int main () {
Node n;
int data; // beware, may contain garbage value.
foo(data, n);
return 0;
}


我接受了第二个建议,为node创建了一个默认构造函数,它可以正常工作。但我确实注意到了你关于内存泄漏的警告。只要我在返回main之前简单地
delete n
,我就应该没事了。@DerekW有什么理由你不能做第一件事吗?这是一个更好的练习。我想我需要一个指针,但看看为什么我要尝试实现它,不需要使用原始指针。因此,我也实施了第一个建议,它确实也在发挥作用。你帮了我很多,非常感谢!我接受了第二个建议,为node创建了一个默认构造函数,它可以正常工作。但我确实注意到了你关于内存泄漏的警告。只要我在返回main之前简单地
delete n
,我就应该没事了。@DerekW有什么理由你不能做第一件事吗?这是一个更好的练习。我想我需要一个指针,但看看为什么我要尝试实现它,不需要使用原始指针。因此,我也实施了第一个建议,它确实也在发挥作用。你帮了我很多,非常感谢!