Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 分配错误中的非Ivalue_C++_Tree_Binary Tree - Fatal编程技术网

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
,如果提供的话),或者让函数成为朋友,在没有访问器函数的情况下攻击成员。但是如果是我,我会