结构属性操作符重载

Struct property operator overload

本文关键字:重载 操作符 属性 结构      更新时间:2023-10-16

我正在为我的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的新类型并重载++操作符

非常感谢每一个帮助过我的人。我很感激!:)