结构属性运算符重载

时间:2015-09-16 08:44:23

标签: c++ struct properties

我正在为我的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);
    }
};

3 个答案:

答案 0 :(得分:0)

你不能完全按照书面形式这样做。运算符的返回类型应为 type

{}}具有coordinate类型,而不是operator++

可能的解决方案(基于@MrMase的代码):

x

我已经制作了一个模板,允许简单的y定义不同的坐标;您可能还将coordinate设为私有字段,并将其子类化为不同的坐标。事实上,似乎模板解决方案更安全,因为它不允许您混合不同的坐标;但是,您可能希望根据实际使用情况重新考虑这一点。

参见完整示例:http://coliru.stacked-crooked.com/a/5a34261310d05a54

答案 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的新类型并重载++运算符

非常感谢所有帮助过的人。我很感激! :)