我正在为我的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);
}
};
答案 0 :(得分:0)
你不能完全按照书面形式这样做。运算符的返回类型应为 type 。
{}}具有
coordinate
类型,而不是operator++
。
可能的解决方案(基于@MrMase的代码):
x
我已经制作了一个模板,允许简单的y
定义不同的坐标;您可能还将coordinate
设为私有字段,并将其子类化为不同的坐标。事实上,似乎模板解决方案更安全,因为它不允许您混合不同的坐标;但是,您可能希望根据实际使用情况重新考虑这一点。
答案 1 :(得分:0)
当重载一元运算符(只有一个操作数的运算符,如增加/减少运算符<table>
<tbody>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
和++
)作为成员函数时,它们没有参数,因为它们是在{上执行的{1}}。例外是后缀增加/减少运算符的虚拟--
参数。
返回值取决于您重载的运算符,但通常对于一元运算符,您返回对象的引用,即this
。
实施例
int
全部记录在this operator overloading reference中,以及互联网上的大量教程。
在不相关的说明中,*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!=
在创建相关的运算符重载时,最好使用现有的运算符。
答案 2 :(得分:0)
似乎不可能重载枚举的属性,所以我要做下一个最好的事情:创建一个名为xcordinate的新类型并重载++运算符
非常感谢所有帮助过的人。我很感激! :)