Почему функция-член не изменяет данные-члены моих объектов? - PullRequest
1 голос
/ 21 декабря 2011

Итак, я работал над проектом для класса информатики, в котором нам нужно создать двоичное дерево поиска и соответствующий индекс. Нам нужно было использовать рекурсию для этого проекта.

Вот моя реализация класса:

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*), лист, на который указывает корень, остается неизменным.

Вот моя функция 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 Ответ

1 голос
/ 21 декабря 2011

Ваш анализ проблемы совершенно верен: указатель передается по значению, поэтому любые изменения, которые функция вносит в значение parent, не видны вызывающей стороне.

Одним из способов решения проблемы является передача указателя parent по ссылке:

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

(обратите внимание на добавленное &).

Таким образом, любые изменения, внесенные в parent внутри функции, будут автоматически видны вызывающей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...