指针地址 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 或右值引用传递右值。
我不能立即为你的问题提供解决方案,因为我不是很清楚你的最终目标是什么。但我确实希望这个答案至少可以引导你的想法,让你想出另一个问题。
我有以下.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 或右值引用传递右值。
我不能立即为你的问题提供解决方案,因为我不是很清楚你的最终目标是什么。但我确实希望这个答案至少可以引导你的想法,让你想出另一个问题。