【发布时间】:2016-09-28 09:07:49
【问题描述】:
我目前正在尝试将一些使用原始类型的代码重构为可以将 setter 和 getter 塞入其中的东西。我想让底层代码的更改变得透明,起初我认为 C++ 的运算符重载会帮助我。
假设我想创建一个“增强的int”类型,例如,它可以像普通的int 一样对待,但允许在我分配给它的任何地方进行进一步的操作,并且只是分配 - 所有其他应保留 int 的属性,例如添加 +=。
起初我认为如果我将int 封装在某个结构中,并填写operator= 重载,我会被设置,如下例所示:
#include<iostream>
typedef struct PowerInt{
int x;
PowerInt(){
cout << "PowerInt created\n";
x = 0;
}
~PowerInt(){
cout << "PowerInt destroyed\n";
}
void operator=(int other){
cout << "PowerInt received " << other << "\n";
this->x = other;
}
}PowerInt;
int main(){
PowerInt a;
a = 3;
return 0;
}
代码按预期编译和运行,但是一旦我尝试做任何其他常规 int 可以做的事情,比如cout << a,或a += 2,甚至是简单的int b = a; 赋值,编译器就会抱怨运算符<< 和 += 不见了。
很公平;然后我尽管如此,至少对于<< 和“分配=”,我可以通过使用某种“通用右值运算符”或某种返回PowerInt.x 的方法来获得我的a 被使用的地方作为右值,自动使int c = (a + 3); 和if (a == 3) {} 等表达式有效。
问题是,我找不到实现这个习语的方法,这很可能与我对 C++ 中运算符重载的工作原理知之甚少有关,或者与我尚不了解的某些语言特性有关。是否有可能完成我在这里尝试的事情?
【问题讨论】:
-
我看不到与rvalue的关系
-
这里有一些不必要的 C-isms 你知道
-
@LightnessRacesinOrbit 你可以把它们指向我,因为在用 C 语言编程近十年之后,我现在只是在摸索 C++ 的表面,你知道的。 :)
-
typedef struct T { } T;.... 只要struct T {};就可以了。如果您想与 C 代码共享您的struct定义,那么可以保持它兼容,但是由于这个具有 C++ 类特性,您肯定不会这样做。
标签: c++ operator-overloading rvalue