我对重载后缀'-'运算符有疑问。 就像在Integer类型的简单示例中一样,无需在代码行的末尾调用它:

int test = 5;
cout << test-- << endl; //Output1: 5
cout << test << endl; //Output2: 4

相反,它被立即调用,而不是最后被调用。

注意: LinkList是我与不同的运算符一起构建的一个类,可用于该类:

operator+=将给定的数字添加到列表的开头,而operator--(int)删除最后一个数据成员。 operator<<只是按顺序打印列表。

LinkList l1;
l1+=1;
l1+=2;
l1+=3;
l1+=4;
l1+=5;
cout << l1 << endl; //Output1: 5 4 3 2 1
cout << l1-- << endl; //Output2: 5 4 3 2
cout << l1 << endl; //Output3: 5 4 3 2 

我知道我可以通过在cout命令之后调用运算符来解决该问题,但是如何使其能够像整数示例一样工作(其中output2在output1上应该具有相同的输出)?

这是运算符的功能:

//Deletes the last node
LinkList LinkList::operator--(int){
    if(list){ //If the list isn't empty
        if(list->NextNode()){ //If there in another node
            Node* newLast = (*this)[list_size - 2]; //Store the new last node
            delete newLast->NextNode(); //Delete the last node
            newLast->InsertNext(NULL);
        }//if
        else{ //The head is the only node
            delete list; //Delete the head
            list = NULL; //The list is now empty
        }//else
        list_size--; //Update the list size
    }//if
    return *this;
}//end operator--(int)

谢谢

===============>>#1 票数:1 已采纳

您首先需要创建当前列表的副本,然后再更改当前列表。 并且必须将副本退还。 在您的示例中,您返回已更改列表的副本。

还应考虑到,当您使用重载的运算符功能时,不会像内置运算符那样产生副作用。

例如,如果复制构造函数有效,则该函数可能看起来像

//Deletes the last node
LinkList LinkList::operator--(int){
    LinkList currentList( *this );

    if(list){ //If the list isn't empty
        if(list->NextNode()){ //If there in another node
            Node* newLast = (*this)[list_size - 2]; //Store the new last node
            delete newLast->NextNode(); //Delete the last node
            newLast->InsertNext(NULL);
        }//if
        else{ //The head is the only node
            delete list; //Delete the head
            list = NULL; //The list is now empty
        }//else
        list_size--; //Update the list size
    }//if
    return currentList;
}//end

  ask by 123 translate from so

未解决问题?本站智能推荐:

2回复

程序未调用正确的重载运算符

我有Directory类,它可以处理File类的对象以及重载的运算符,如下所示: 好吧,现在出现问题了 该程序现在调用运算符int()而不是运算符<<。 因此,命令std::cout <<d行为类似于std::cout << (int)d ,
1回复

C ++编译器如何扩展前缀和后缀运算符++()?

考虑: 我正在试验这个以确定编译器如何扩展对前缀和后缀运算符的调用。 例如,当我写这样的东西时: 我希望它能扩展到像“e.operator ++(int)”这样的东西,或者更进一步 扩展到类似“e.operator ++(2)。”的东西,但我得到的是编译器抱怨某些“
4回复

重载*运算符未给出匹配错误

嗨,我正在尝试创建一个光线跟踪器,以渲染基于三角形的多边形模型。 我在point3d.h中有一个指向3D的结构,其中包含x,y和z坐标。 在这里,我尝试使用*运算符将两个Point3D一起使用 当我尝试将多个两个Point3D在一起时,出现了不匹配错误。 这是代码失败的地
4回复

为下标运算符和函数调用运算符提供默认参数

在下面的代码中,我为数组下标运算符提供了默认参数 。 但是,编译器生成了一个错误: 但是,如果我为函数调用运算符提供默认参数。 它工作正常。 所以,我有一个问题: 为什么不允许数组下标运算符的默认参数? 为什么允许函数调用运算符的默认参数?
1回复

如何覆盖运算符<<?

嘿,我已经覆盖了operator<<并且当我试图在打印方法(const)中使用它时,我收到一个错误: 覆盖运算符: 在哪里我试图使用它:
2回复

重载运算符%

我在这里想要做的是重载%运算符,以便将分子乘以给定的数字。 我在程序中所有其他重载的运算符都可以正常工作,但这给我带来了问题。 为了隔离此问题,我仅使用此重载运算符创建了一个单独的较小程序。 从modu.h文件中(希望省略了一些不相关的部分): 当我像这样在main.cpp文件
1回复

重载运算符

我目前正在尝试为我的方形列表修饰符重载.begin()上的++运算符。 我的hpp文件中包含以下内容: 目前,这需要我将迭代器放在方形列表对象的内部。 我需要做的是在.cpp文件执行++ name.begin()时调用++方法。 而不是将该值放入我的容器中,然后递增该容器。
3回复

如何更改and(&)运算符?

我们知道&运算符用于引用和返回变量的地址。 我想做的就是将运算符语法更改为_或| (你明白了)。 我怎样才能做到这一点? 默认值: 我想做的事:
1回复

运算符重载,所有运算符的定义/标题

如何最好地将以下迭代器代码拆分为标头和定义。 来自: http : //www.cplusplus.com/reference/iterator/iterator/ 在这种情况下,您将如何实现其他运算符? 此示例还显示了将数组传递给迭代器,但是如果希望能够遍历类实例具有的某些
1回复

C ++调用+运算符的这种用法是什么? 目的是什么?

我最近在运算符重载审查中看到了一个例子,他们讨论了+运算符本质上是一个带有2个参数的函数。 稍微戳了一下,我决定更深入地看一下,发现调用+就像一个函数确实有效,而不是你期望的那样......例如: 这个组件是 对+的调用只是将最后一个参数移动到eax中。 谁能告诉我这