指针地址 return 值

Address of pointer return value

我有以下.h文件

class Node
{
private :
    int m_data;
    Node* m_left;
    Node* m_right;
public:
    Node(int data) : m_data(data), m_left(nullptr), m_right(nullptr) {}
    Node* getLeft() { return m_left; }
    Node* getRight() { return m_right;  }
    int getData() { return m_data;  }
};

class Tree
{
private :
    Node * m_root;
    unsigned int m_size;
    void freeNode(Node*);
    bool insert(Node**, int );
public:
    Tree() : m_size(0) {}
    ~Tree();
    int findMaximumVericalSum();
    bool insert(int);
};

实施,我收到一个错误 - 哪里出了问题,我应该如何解决

'&' requires l-value

The address-of operator ( & ) must have an l-value as operand.

bool Tree::insert(Node** root, int data)
{
    Node* newNode = new Node(data);
    if (*root == nullptr) {
        *root = new Node(data);
    }
    else if (data < (*root)->getLeft()->getData())
    {
        // error '&' requires l-value
        insert(&((*root)->getLeft()), data);
    }
    else if (data > (*root)->getLeft()->getData())
    {

    }
}
Node* getLeft()

这个函数return是一个纯右值。

return m_left;

纯右值从此表达式初始化。无法从纯右值获取 m_left 的地址。更一般地,不可能获得任何纯右值的地址。 addressof 运算符的操作数必须是左值。

&((*root)->getLeft()

what is wrong

这里,addressof 运算符的操作数是纯右值。节目是ill-formed.

how should I fix it

不要尝试将 addressof 运算符应用于纯右值表达式。

如果您打算将指向 (*root)->m_left 的指针传递给函数,那么您需要一些方法来访问该成员。

  • 一个解决方案是通过 public 或通过好友关系授予成员访问权限。
  • 另一种方法是提供 public getter return 作为参考,而不是成员的副本。
  • 第三种解决方案是添加一个setter 函数。在这种情况下,您可以使用局部变量作为递归的参数,然后在变量被函数修改后调用setter。

此外,Tree::insert 声明为 return bool,但缺少任何 return 语句。程序的行为未定义(或者如果它首先是 well-formed)。

P.S。您的函数不处理 data == (*root)->getLeft()->getData().

的情况

令我惊讶的是,我无法找到所问问题的良好副本(尽管还有其他问题)。

您看到的错误来自以下代码段:

&((*root)->getLeft())

并且可以大大简化为以下非常小的部分:

int bar();
void foo(int*);

void baz() {
    foo(&bar());
}

(也可以在https://gcc.godbolt.org/z/PuwtuT上看到)

这会产生完全相同的编译器错误。这样做的原因是 C++ 禁止获取纯右值的地址,虽然整个 rvalue/lvalue 的讨论非常复杂,但很容易记住当函数 returns 一个值时,它始终是一个纯右值。 (如果 function returns 有引用,那就另当别论了)。但是,您可以通过 const 或右值引用传递右值。

我不能立即为你的问题提供解决方案,因为我不是很清楚你的最终目标是什么。但我确实希望这个答案至少可以引导你的想法,让你想出另一个问题。