结构属性操作符重载
Struct property operator overload
我正在为我的Arduino编写c++游戏,我最近发现了结构体中操作符重载的乐趣。到目前为止一切顺利!我现在被困在属性重载操作符的语法上了。我想实现这样的东西,如果我的x或y值增加超过屏幕宽度,我将值包装回0。很多谢谢!
// My guess :(
x& operator++(x &newx, int){
if (x == SCREEN_WIDTH - 1)
return 0;
else
return x + 1;
}
我的结构定义是:
struct point_t
{
uint8_t x;
uint8_t y;
x& operator++(x &newx, int){
if (x == SCREEN_WIDTH - 1)
return 0;
else
return x + 1;
}
point_t& operator=(const point_t &p)
{
x = p.x;
y = p.y;
return *this;
}
bool operator==(const point_t &p) const
{
return (x == p.x && y == p.y);
}
bool operator!=(const point_t &p) const
{
return !(x == p.x && y == p.y);
}
};
您不能完全按照所写的那样做。操作符的返回类型应为类型。
您可以做的是创建一个新的类型,例如coordinate
,为它重载operator++
,并使您的x
(和y
)具有coordinate
类型,而不是uint8_t
。
可能解决方案(基于@MrMase的代码):
template<uint8_t MAX>
class coordinate_t
{
private:
int8_t _p;
public:
coordinate_t(int8_t p = 0): _p(p) {}
// Postfix ++
coordinate_t operator++(int)
{
coordinate_t p(_p);
++_p;
if (_p > MAX - 1)
_p = 0;
return p;
}
// Postfix --
coordinate_t operator--(int)
{
coordinate_t p(_p);
--_p;
if (_p < 0)
_p = MAX - 1;
return p;
}
int get() const {return _p;}
};
typedef coordinate_t<SCREEN_WIDTH> xcoordinate_t;
typedef coordinate_t<SCREEN_HEIGHT> ycoordinate_t;
我已经使它成为一个模板,允许一个简单的typedef
来定义不同的坐标;您还可以将MAX
作为一个私有字段,并将其子类化为不同的坐标。事实上,似乎模板解决方案更安全,因为它不会允许您混合不同的坐标;但是,您可能需要根据实际使用情况重新考虑这一点。
查看完整示例:http://coliru.stacked-crooked.com/a/5a34261310d05a54
当重载一元操作符(只有一个操作数的操作符,如增加/减少操作符++
和--
)作为成员函数时,它们没有参数,因为它们是在this
上执行的。例外是后缀递增/递减操作符的假int
参数。
返回值根据重载的操作符不同而不同,但对于一元操作符,通常返回对对象的引用,即*this
。
struct point_t
{
int x;
// Prefix increase operator
point_t& operator++()
{
++x;
return *this;
}
// Postfix increase operator
point_t operator++(int)
{
point_t old(*this); // Create new object using copy-constructor
operator++(); // Call prefix operator++ on `this`
return old; // Return old value, before increment
}
...
};
在这个操作符重载参考中都有详细的说明,在互联网上也有大量的教程。
在一个不相关的注意事项上,
operator!=
可以通过使用您已经实现的==
操作符来实现:
bool operator!=(const point_t& p) const
{
return !(*this == p);
}
在创建相关的操作符重载时,使用现有的操作符总是一个好主意。
似乎不可能重载枚举的属性,所以我要做下一个最好的事情:创建一个名为xcoordinate的新类型并重载++操作符
非常感谢每一个帮助过我的人。我很感激!:)相关文章:
- 重载操作符+:表达式必须是整型或无作用域枚举类型
- 重载操作符
- 如何重载操作符==外模板类使用友元函数
- 重载*操作符,使其在左右两边都工作
- 重载操作符<对于非随机迭代器
- 在c++中重载操作符的时间和原因
- 如何在c++中重载=操作符来通过引用进行复制
- 如何在c++中获取定义为友元的重载操作符的地址
- 使用重载操作符的文件操作表达式没有给出预期的结果
- 重载操作符()
- 重载操作符()并在类内使用
- 类中的重载操作符+
- 定时使用重载操作符
- c++带类的重载操作符
- 用列表容器重载[]操作符
- 重载操作符=
- 任何重载操作符()的静态检测
- 重载操作符以处理类对象
- 在使用另一个类的类中重载操作符==
- 派生类和基类中的重载操作符不同