Ошибка при передаче указателя по ссылке - PullRequest
2 голосов
/ 05 апреля 2020

Я добавлю ссылку на эту очень похожую проблему: C ++ начальное значение ссылки на неконстантное должно быть lvalue Ошибка та же (начальное значение ссылки на неконстантное должно быть lvalue) но обстоятельства разные. В отличие от этого примера, в моей функции указатель ДОЛЖЕН быть изменен. Я пишу рекурсивную функцию для добавления узла в дерево двоичного поиска. Функция включена сюда.

1   void BST::insert(BSTNode*& current, BSTNode*& newNode)
2   {
3       //If empty, assign
4       if (current == nullptr)
5           current = newNode;
6   
7       //If less, go left
8       else if (newNode->getEng() <= current->getEng()) 
9           insert(current->getLeft(), newNode);
10   
11      //If greater, go right
12      else 
13          insert(current->getRight(), newNode);
14   }

Я получаю сообщение об ошибке в строках 9 и 13. Как показано, я передаю указатели как current, так и newNode по ссылке, но у него нет проблем с newNode, только мои current->getLeft() и current->getRight() заявления. В вопросе, на который я ссылался, был сделан комментарий, что ошибка в том, что передача по ссылке должна использоваться только тогда, когда значение будет изменено в функции. В первом случае current == nullptr значение изменено, поэтому я не уверен, что делать.

Редактирование для включения класса BSTNode

class BSTNode
{
public:
    BSTNode();
    BSTNode(char, string);

    void setLeft(BSTNode* newLeft) { left = newLeft; }
    void setRight(BSTNode* newRight) { right = newRight; }
    BSTNode* getLeft() { return left; }
    BSTNode* getRight() { return right; }
    char getEng() { return Eng; }
    string getMorse() { return Morse; }

private:
    char Eng;
    string Morse;
    BSTNode* left;
    BSTNode* right;
};

И это мой класс BST:

class BST
{
public:
    BST(string fileName);
    ~BST();

    bool isEmpty();
    void addNode(char english, string morse);
    void insert(BSTNode** current, BSTNode*& newNode);

    //bool searchTree(char english, string& morse);

private:
    BSTNode* root;
    int nodeCount;
};

1 Ответ

1 голос
/ 05 апреля 2020

Компилятор спасает вас от поломок. При вызове для вставки в строку 9 вы передаете insert ссылку на временное значение, возвращаемое current->getLeft(). Если вы затем измените это временное изменение, оно будет потеряно. Исправьте getLeft, чтобы вернуть изменяемую ссылку.

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