当前位置: 首页 > 知识库问答 >
问题:

如何重载C中的后缀运算符?[副本]

龙德润
2023-03-14

如何正确地为任何类型生成前缀和后缀运算符?

例如,我有一个枚举类:

enum class Traffic_light { green, yellow, red };

我尝试创建操作符重载,如:

Traffic_light operator++(int)
{
    return Traffic_light::green;
}


Traffic_light operator++()
{
    return Traffic_light::red;
}

但这不起作用。

Traffic_light tl = Traffic_light::green;
++tl; // Error
tl++; // Error

错误:“operator”不匹配

一般来说,如何重载运算符?

我想看看任何类型的通用指南。

共有2个答案

华涵意
2023-03-14

你可以这样做

enum class Traffic_light { green, yellow, red };

Traffic_light& operator++(Traffic_light& t)
{
    if(t == Traffic_light::red)
        t = Traffic_light::green;
    else
        t = static_cast<Traffic_light>(static_cast<int>(t) + 1);
    return t;
}

Traffic_light operator++(Traffic_light& t, int)
{
    auto temp{t};
    ++t;
    return temp;
}

我将其实现为循环。您可以阅读下面的链接以获取有关运算符重载的总体信息。例如,哪些操作符不能重载,等等。

运算符重载

暴招
2023-03-14

由于需要使操作符成为非成员函数,因此需要将参数传递给操作符:

Traffic_light operator++(Traffic_light const&, int)
{
    return Traffic_light::green;
}


Traffic_light operator++(Traffic_light const&)
{
    return Traffic_light::red;
}

请注意,这些是返回的临时变量,而不是对特定Traffic_light对象的引用,这通常不是这些运算符的实现方式。

这是一个演示。

 类似资料:
  • 主要内容:运算符重载的实现,可重载与不可重载的运算符C# 中支持运算符重载,所谓运算符重载就是我们可以使用自定义类型来重新定义 C# 中大多数运算符的功能。运算符重载需要通过 operator 关键字后跟运算符的形式来定义的,我们可以将被重新定义的运算符看作是具有特殊名称的函数,与其他函数一样,该函数也有返回值类型和参数列表,如下例所示: public static Box operator+ (Box b, Box c) {     Box bo

  • 本文向大家介绍c++ *运算符重载,包括了c++ *运算符重载的使用技巧和注意事项,需要的朋友参考一下 运算符重载,对象和指向对象的指针 直接上code 运行结果: t是指向test对象的指针,(*t) 也就是一个test对象。 所以只有 *t才真正的调用了 运算符的重载函数。

  • 我试图重载结构中映射的运算符<<,但得到一个编译错误: 不存在从“std::_rb_tree_const_iterator >”到“std::_rb_tree_iterator >”的合适的用户定义转换

  • 对于一个作业,学生们必须制作一个卡片结构来保存卡片的花色、等级和位图。此结构需要一个重载的" 然而,操作员 事先非常感谢。

  • 你好,Stack,我现在正想写一个RPN转换器,我是C新手。但是我遇到了问题。希望我能详细解释这些问题。我使用数组来堆叠运算符。当我开始讨论以下问题时,让我们使用示例“5 8”: 出于某种原因,它会将运算符推到堆栈上,但不会将运算符添加到后缀字符串变量中,因为我也在添加我的元素。我看了一下我的pop函数,这似乎是正确的,但我很困惑。如果你能把我引向正确的方向那就太好了。 这是我的完整代码: 另外,

  • 我使用以下逻辑实现中缀到后缀的转换,以便稍后对其进行评估。 > 在中缀转换上循环,并在每次迭代中执行以下操作: 如果是空格,请忽略它 注意:当我遇到或时,我可以确定它是二进制还是一元操作符。如果它是二进制的,我将它添加到堆栈中作为'或,但是如果它是一进制的,我将它添加为'@'或'$'。 该算法运行良好,除非两个一元运算符相邻。 例如,变成了,这是错误的。 怎么了?这个问题的正确解决方案是什么,不会