C++ 内联运算符重载,请参阅当前对象

C++ Inline Operator Overloading, refer to current object

提问人:Derek Muller 提问时间:1/29/2020 最后编辑:Vlad from MoscowDerek Muller 更新时间:1/29/2020 访问量:414

问:

因此,我最近才开始使用“内联运算符重载”或任何名称...... 无论如何!!我怎样才能引用我从中调用函数的对象。以下是感兴趣的代码:

class PlayingCard
{
private:
    enum Suit {diamond, hearts, spades, clubs};
    Suit suit;
    enum Color {red, black};
    Color color;
    int value = -1;
public:
    //Inline stuff

    //make card the same as c1
    inline operator=(const PlayingCard &c1) {
        suit = c1.suit;
        color = c1.color;
        value = c1.value;
        return true;
    }

    inline operator%(PlayingCard &c1) {
        PlayingCard copy1;
        copy1 = c1;
        c1 = this;
        this = copy1;
        return true;
    }

正如你所看到的,我有 PlayingCard 类。第一个内联运算符按应有的方式工作。如果我有 2 张 PlayingCard:c1 和 c2,并定义了 c2 的私有值,那么 c1 = c2 使 c1 的私有值等于 c2。

第二个内联函数旨在通过执行 c1 % c2 在 c1 和 c2 之间交换值。如代码所示,我希望使用“this”来指代 c1,但它不起作用。有没有办法在这个函数中引用 c1?

我知道我在此期间会使用一些解决方法,但我宁愿使用我原来的方法,我觉得它对将来的使用也很有帮助。

C++ 赋值运算符

评论

0赞 Mat 1/29/2020
C++中没有运算符这样的东西。<->
0赞 John3136 1/29/2020
你的意思是使用?this

答:

0赞 TheUndeadFish 1/29/2020 #1

C++ 中的运算符重载只允许您执行语言提供的某些操作。你不能自己编造。所以你不能做一个<->

(可能有一些复杂的方法可以从个人 、 和运算符中组装一些东西。但即使这是可能的,它可能也不值得付出努力,并且很可能也会允许意外的奇怪用法。<->

1赞 Vlad from Moscow 1/29/2020 #2

C++ 中没有这样的运算符(您后来在更新的问题中更改为该运算符)。您似乎要定义一个成员函数。但在任何情况下,您都不能交换常量对象。因此,函数的参数应该是非常量引用。<->%swap

默认情况下,在类定义中定义的成员函数具有内联的函数说明符。因此,无需明确指定它。

赋值运算符应返回对已分配对象的引用。

给你。

PlayingCard & operator =( const PlayingCard &c1 ) 
{
    if ( this != &c1 )
    {
        suit  = c1.suit;
        color = c1.color;
        value = c1.value;
    }

    return *this;
}

void swap( PlayingCard &c1 ) 
{
    if ( this != &c1 )
    {
        std::swap( suit, c1.suit );
        std::swap( color, c1.color );
        std::swap( value, c1.value );
    }
}

评论

0赞 Derek Muller 1/29/2020
哈哈,是的,我注意到在进行变通后我无法使用 <->。交换功能肯定会有所帮助。有没有办法在我尝试时引用对象本身?无论我是否在这里使用它,我都觉得知道它可能会有所帮助。感谢您的快速回答!
0赞 Vlad from Moscow 1/29/2020
@DerekMuller 对不起,我不明白你的问题。你是说指针这个吗?
0赞 Vlad from Moscow 1/29/2020
@DerekMuller 您可以在 swap 函数中使用指针 this,前提是该类具有 copy 或 move 构造函数。
0赞 Derek Muller 1/29/2020
呃......如果我不切换到 void swap 函数并将其保留为它自己的运算符(现在是 % 而不是 <->) 有没有办法使用已经定义的“=”运算符将函数中的值交换为 % 并引用当前的 PlayingCard,将单独的临时 PlayingCard 定义为中间人。因此,card % c1 将引用类中的函数,写成 : operator%(const PlayingCard c1){PlayingCard temp; temp = c1; c1 = <refer to card>; <refer to card> = temp; return;}有什么方法可以做<参考卡>部分吗?
0赞 Vlad from Moscow 1/29/2020
@DerekMuller 使用运算符而不是函数名称交换会让代码的读者感到困惑。正如我已经在评论中所写的那样,您可以在 swap 函数中使用类的中间对象将对象 *this 与作为参数传递的对象交换。