C++ 分配错误中的非Ivalue
在编译期间,我两次收到上述错误消息。其他一切工作正常,即没有其他编译时错误。这是一个简单的二叉树程序,错误源函数是一个交换或镜像函数,用于交换所有子树。下面是函数C++ 分配错误中的非Ivalue,c++,tree,binary-tree,C++,Tree,Binary Tree,在编译期间,我两次收到上述错误消息。其他一切工作正常,即没有其他编译时错误。这是一个简单的二叉树程序,错误源函数是一个交换或镜像函数,用于交换所有子树。下面是函数 template <class dataType> void swapSubTrees ( BinaryTree <dataType> * bt ) { if(bt == NULL) { //do nothing } else {
template <class dataType>
void swapSubTrees ( BinaryTree <dataType> * bt )
{
if(bt == NULL)
{
//do nothing
}
else
{
swapSubTrees(bt->left());
swapSubTrees(bt->right());
BinaryTree <int> *temp;
temp = bt->left();
bt->left() = bt->right();
bt->right() = temp;
}
}
b1是从类BinaryTree实例化的对象,它位于我的树的顶部。有相应的对象b2、b3、b4和b5,它们是树的其他节点,显然来自我遗漏的代码。
不管怎样,我似乎找不到哪里出了问题,那会是什么?任何帮助都很好,谢谢!
左函数看起来像
Template <class dataType>
BinaryTree <dataType> * BinaryTree<dataType> :: left()
{
return leftTree;
}
模板
BinaryTree*BinaryTree::left()
{
返回左树;
}
我猜给出错误的行是:
bt->left() = bt->right();
bt->right() = temp;
?
不能将这样的函数调用用作表达式的左侧
将此方法添加到BinaryTree模板类:
template<class dataType>
void BinaryTree<dataType>::swapChildren()
{
BinaryTree *tmp = leftTree;
leftTree = rightTree;
rightTree = tmp;
if (leftTree)
leftTree->swapChildren();
if (rightTree)
rightTree->swapChildren();
}
模板
void BinaryTree::swapChildren()
{
BinaryTree*tmp=leftTree;
leftTree=rightTree;
rightTree=tmp;
if(leftTree)
leftTree->swapChildren();
if(rightTree)
rightTree->swapChildren();
}
然后将您的免费功能更改为:
template <class dataType>
void swapSubTrees ( BinaryTree <dataType> * bt )
{
if(bt != NULL)
bt->swapChildren();
}
模板
无效交换树(二进制树*bt)
{
如果(bt!=NULL)
bt->swapChildren();
}
我猜给出错误的行是:
bt->left() = bt->right();
bt->right() = temp;
?
不能将这样的函数调用用作表达式的左侧
将此方法添加到BinaryTree模板类:
template<class dataType>
void BinaryTree<dataType>::swapChildren()
{
BinaryTree *tmp = leftTree;
leftTree = rightTree;
rightTree = tmp;
if (leftTree)
leftTree->swapChildren();
if (rightTree)
rightTree->swapChildren();
}
模板
void BinaryTree::swapChildren()
{
BinaryTree*tmp=leftTree;
leftTree=rightTree;
rightTree=tmp;
if(leftTree)
leftTree->swapChildren();
if(rightTree)
rightTree->swapChildren();
}
然后将您的免费功能更改为:
template <class dataType>
void swapSubTrees ( BinaryTree <dataType> * bt )
{
if(bt != NULL)
bt->swapChildren();
}
模板
无效交换树(二进制树*bt)
{
如果(bt!=NULL)
bt->swapChildren();
}
如果将函数left()和right()重写为指针的返回引用,则不会出现问题。如果将函数left()和right()重写返回对指针的引用时,将不会出现问题。:这里的问题是您试图为右值赋值
本质上,原因是left
和right
返回的值是临时对象。您正在返回指针的副本,但无法将此副本分配给
编译此文件的方法是更改left
和right
函数,以返回指针的引用,该引用可以指定给。具体做法如下:
Template <class dataType>
BinaryTree <dataType>*& BinaryTree<dataType> :: left()
{
return leftTree;
}
模板
BinaryTree*&BinaryTree::left()
{
返回左树;
}
(对于右侧
,情况类似)
注意星号(*)后面的符号(&)。这意味着返回的值是一个引用。这称为按引用返回,而不是按值返回
现在,这将导致代码编译。但你真的应该问问自己这是否是你想要的。您是否希望允许外部人员更改leftTree
指向BinaryTree
内部的内容
更好的选择可能是为这两个函数添加一个setter函数,并调用它们。这里的问题是您试图为右值赋值
本质上,原因是left
和right
返回的值是临时对象。您正在返回指针的副本,但无法将此副本分配给
编译此文件的方法是更改left
和right
函数,以返回指针的引用,该引用可以指定给。具体做法如下:
Template <class dataType>
BinaryTree <dataType>*& BinaryTree<dataType> :: left()
{
return leftTree;
}
模板
BinaryTree*&BinaryTree::left()
{
返回左树;
}
(对于右侧
,情况类似)
注意星号(*)后面的符号(&)。这意味着返回的值是一个引用。这称为按引用返回,而不是按值返回
现在,这将导致代码编译。但你真的应该问问自己这是否是你想要的。您是否希望允许外部人员更改leftTree
指向BinaryTree
内部的内容
更好的选择可能是为这两个函数添加setter函数,并调用它们。add
void setLeft(二进制树*其他)代码>
及
void setRight(二进制树*其他)代码>
到您的BinaryTree类,假设它们还不存在(我将把它们的实现留给您!)
然后将错误行更改为
bt->setLeft( bt->right() );
bt->setRight( temp );
加
void setLeft(二进制树*其他)代码>
及
void setRight(二进制树*其他)代码>
到您的BinaryTree类,假设它们还不存在(我将把它们的实现留给您!)
然后将错误行更改为
bt->setLeft( bt->right() );
bt->setRight( temp );
我认为您可能需要调用swapusbtrees(bt->left());等等left()
和right()
看起来像什么?我会补充我的问题,我建议用if(bt==NULL)
交换if(bt!=NULL)
并跳过当前的,然后我想你可能需要调用交换树(bt->left());等等left()
和right()
看起来像什么?我会添加到我的问题中,我建议将if(bt==NULL)
与if(bt!=NULL)
交换,并跳过当前的,然后如果它返回一个非常量引用,您可以这样做,但我不建议这样做。或者如果它返回一个类类型,那么我该怎么办(您可以使用setter(setLeft
和setRight
,如果提供的话),或者让函数成为朋友,在没有访问器函数的情况下攻击成员。但是如果是我,我会