【问题标题】:How to call a function in main with contains a reference to a node如何在 main 中调用包含对节点的引用的函数
【发布时间】:2012-12-01 18:01:25
【问题描述】:

我很好奇如何实现这样的功能。例如,

我有类似的东西:

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

void foo(int number, Node & n) {
// do something
}

然后在 main 我需要调用该函数,这样的东西不起作用:

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

我需要一个包装函数,以便在 main 中通过引用传递节点,这就是我苦苦挣扎的地方,我只是不知道如何解决这个问题。我尝试了一些想法,我在网上阅读了很多内容,但我只是没有掌握它。任何理解如何实现这个包装函数的帮助都会很棒。

【问题讨论】:

    标签: c++ pointers wrapper pass-by-reference nodes


    【解决方案1】:

    您根本没有Node。您只有一个指向 Node 的指针,它还没有特别指向任何地方(您的 data 也未初始化)。 Node& 类型的引用参数要求您传递 Node,而不是 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;
    }
    

    但是,我不提倡在这种情况下使用原始指针 - 你必须记住 delete 以避免内存泄漏。您可以改用std::unique_ptr<Node> n(new Node()) 而不是Node* n = new Node(),但更喜欢使用具有自动存储持续时间的Node(如第一个示例)。

    【讨论】:

    • 我接受了第二个建议,为节点创建了一个默认构造函数,并且它可以工作。但我确实注意到了你关于内存泄漏的警告。只要我在返回 main 之前简单地 delete n 就可以了。
    • @DerekW 为什么你不能做第一个?这是很多更好的做法。
    • 我在想我需要一个指针,但看看我为什么要尝试完成它并不是必须使用原始指针。所以我也实施了第一个建议,它确实也有效。你帮了我很多,非常感谢!
    【解决方案2】:

    您的函数foo 引用了Node,但您传递的是一个指针。更改函数或main() 中的代码,例如

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

    void foo(int number, Node* n) {
    // do something
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 2021-08-28
      相关资源
      最近更新 更多