通过指针传递

时间:2015-01-29 08:02:00

标签: c++ pointers

我正在使用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-&gt;数据被正确分配dataValue,root-&gt; Left和root-&gt; 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 **的内容,但是当我尝试使用Node时,我无法让类型调和(即root-&gt; Data不断抛出错误C2227)。 / p>

我知道解决方案很简单,我似乎无法理解我所缺少的东西。

1 个答案:

答案 0 :(得分:3)

这是一个有问题的一行:

root = new Node(dataValue);

这是有问题的,因为C ++默认按值传递参数,这也适用于指针。这意味着函数root内部是原始指针的副本,更改副本当然不会更改原始文件。

您需要通过引用传递指针

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

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