提问人:Derek Muller 提问时间:1/29/2020 最后编辑:Vlad from MoscowDerek Muller 更新时间:1/29/2020 访问量:414
C++ 内联运算符重载,请参阅当前对象
C++ Inline Operator Overloading, refer to current object
问:
因此,我最近才开始使用“内联运算符重载”或任何名称...... 无论如何!!我怎样才能引用我从中调用函数的对象。以下是感兴趣的代码:
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?
我知道我在此期间会使用一些解决方法,但我宁愿使用我原来的方法,我觉得它对将来的使用也很有帮助。
答:
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 与作为参数传递的对象交换。
评论
<->
this