为什么成员函数不能更改我的对象数据成员?

时间:2011-12-21 17:43:26

标签: c++ visual-studio-2010

所以我正在研究计算机科学课程的项目,我们需要在其中创建二叉搜索树和相应的索引。我们需要为这个项目使用递归。

这是我的类实现:

class Leaf;
struct indexEntries;
class BinarySearchTree{
    public:
        BinarySearchTree();
        ~BinarySearchTree();

        //Helper Functions for recursive calls
        std::string search(std::string);
        void BuildTree(std::string);
        void inOrderPrint();

    private:
        //Recursive Functions
        void BuildTreeR(int start, int end, Leaf * r);
        void inOrderPrint(Leaf * start);
        Leaf * search(std::string inquiry, Leaf * start);
        void DeallocateTree(Leaf * start);

        //Data members
        Leaf * root;
        std::vector<indexEntries> BSTindex;     
};


class Leaf{
    public:
        Leaf(){
            indexID = "";
            AccNum = "";
            left = NULL;
            right = NULL;
        };
        void set_index(std::string input)      {indexID = input;};
        void set_AccNum(std::string input)     {AccNum = input;};
        void set_left(Leaf* newLeft)   {left = newLeft;};
        void set_right(Leaf* newRight) {right = newRight;};
        std::string get_index()    {return indexID;};
        std::string get_AccNum()   {return AccNum;};
        Leaf * get_left()  {return left;};
        Leaf * get_right() {return right;};

    private:
        std::string indexID;
        std::string AccNum;
        Leaf * left;
        Leaf * right;
};

当我尝试将Leaf * BinarySearchTree::root传递给函数void BinarySearchTree::BuildTreeR(int, int, Leaf*)时,根所指向的Leaf将保持不变。

这是我的BuildTreeR()函数:

void BinarySearchTree::BuildTreeR(int start, int end, Leaf * parent){
    int mid = (start+end)/2;
    if(parent == NULL){
        parent = new Leaf;
        parent->set_index((BSTindex[mid]).indexID);
        std::string fullEntry = BSTindex[mid].dataBaseEntry;
        parent->set_AccNum(fullEntry.substr(4, 3));
    }

    if((mid-1)>start){
        BuildTreeR(start, mid-1, parent->get_left());
    }
     if((mid+1)<end){
        BuildTreeR(mid+1, end, parent->get_right());
    }
}

使用调试器,我发现Leaf * parent指向的叶子被更改,但是这些更改不会转移到Leaf * BinarySearchTree::root,这会阻止我的程序运行。

调试器说我想要改变的数据的值是

CXX0030: Error: expression cannot be evaluated  

有没有人在此之前发生过这种情况/知道如何修复它?

1 个答案:

答案 0 :(得分:1)

您对问题的分析是完全正确的:指针是按值传递的,因此函数对parent的值所做的任何更改都不会被调用者看到。

解决问题的一种方法是通过引用传递parent指针:

void BinarySearchTree::BuildTreeR(int start, int end, Leaf *& parent){

(请注意添加的&)。

这样,对函数内部的parent所做的任何更改都将自动对调用者可见。