gpt4 book ai didi

c++ - 通过指针传递

转载 作者:行者123 更新时间:2023-11-28 00:19:34 29 4
gpt4 key购买 nike

我正在使用 VS13 为学校开发一个 C++ 程序。我需要将数据插入 BST。我得到了一个定义为 Add(int dataValue) 的函数; (公开下)只取数据值。我定义了第二个 Add() 函数,它也将 Node* 作为参数,以便使 Add() 递归。 (参见下面代码的 .h 部分)

#include <iostream>
#include <queue>

class HW2BST
{
private:
struct Node
{
int Data;
Node* Left;
Node* Right;

Node(int dataValue);
};

Node* m_root;

bool Add(Node* root, int dataValue);

public:
bool Add(int dataValue);

我的问题是,当从 main 调用 tree.Add(int) 时,我尝试将 m_root 传递给第二个 Add(Node*, int) 函数以插入数据。单步执行函数并在运行时观察 m_root 和 root,我看到 Add(Node*, int) root 的内部设置为 NULL,正如我预期的那样。当它通过 root->Data 时,正确分配了 dataValue,并且 root->Left 和 root->Right 被正确分配给 NULL。但是这些分配不会传回给 m_root。一旦函数退出,root 就被销毁,m_root 没有更新,我就没有树了。 (见下面的.cpp)

#include "HW2BST.h"

using namespace std;

HW2BST::Node::Node(int dataValue)
{
Data = dataValue;
Left = Right = NULL;
}

HW2BST::HW2BST(void)
{
m_root = NULL;
}

bool HW2BST::Add(int dataValue)
{
return Add(m_root, dataValue); // Add (overload) recursively searches then inserts dataValue, then returns result
}

bool HW2BST::Add(Node* root, int dataValue)
{
if (!root) // verify if node exists
{
root = new Node(dataValue); // if node does not exist, implement new node and set dataValue
if (!root) // if node not allocated correctly, return false
return false;
else // else return true (both new node implemented and value added to tree)
return true;
}
else if (dataValue < root->Data) // if not empty, check data value with current data
return Add(root->Left, dataValue); // if less than, travel down left child
else if (dataValue > root->Data)
return Add(root->Right, dataValue); // if greater than, travel down right child
else
return false; // if equal to, ignore (double entry)
}

我已经和我的教授谈过了,他说了一些关于改用 Node** 的事情,但是当我尝试这样做时,我无法协调类型(即 root->Data 不断抛出错误 C2227)。

我知道解决方案很简单,但我似乎无法理解我遗漏了什么。

最佳答案

这是一个有问题的行:

root = new Node(dataValue);

这是有问题的,因为 C++ 默认按值传递参数,指针也是如此。这意味着 root 函数内部是原始指针的拷贝,更改拷贝当然不会更改原始指针。

您需要通过引用传递指针:

bool Add(Node*& root, int dataValue);

您当然可以模拟使用指针通过引用传递,就像在 C 中所做的那样,但是您必须记住取消引用指针以及使用寻址运算符 & 传递指针时。但由于 C++ 具有适当的引用,因此不需要这样做。

关于c++ - 通过指针传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28209654/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com