如何正确地为任何类型生成前缀和后缀运算符?
例如,我有一个枚举类:
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”不匹配
一般来说,如何重载运算符?
我想看看任何类型的通用指南。
你可以这样做
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;
}
我将其实现为循环。您可以阅读下面的链接以获取有关运算符重载的总体信息。例如,哪些操作符不能重载,等等。
运算符重载
由于需要使操作符成为非成员函数,因此需要将参数传递给操作符:
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函数,这似乎是正确的,但我很困惑。如果你能把我引向正确的方向那就太好了。 这是我的完整代码: 另外,
我使用以下逻辑实现中缀到后缀的转换,以便稍后对其进行评估。 > 在中缀转换上循环,并在每次迭代中执行以下操作: 如果是空格,请忽略它 注意:当我遇到或时,我可以确定它是二进制还是一元操作符。如果它是二进制的,我将它添加到堆栈中作为'或,但是如果它是一进制的,我将它添加为'@'或'$'。 该算法运行良好,除非两个一元运算符相邻。 例如,变成了,这是错误的。 怎么了?这个问题的正确解决方案是什么,不会