我正在尝试围绕 int 开发一个非常简单的(现在的)包装类,并且希望重载=运算符以实现类似以下内容:
class IntWrapper
{
...
private:
int val;
}
int main ( )
{
IntWrapper a;
int b;
a = 5; // uses overloaded = to implement setter
b = a; // uses overloaded = to implement getter
}
然而,我正在聚集,这是不可能做到的。实现setter非常简单,例如:
class IntWrapper
{
...
IntWrapper& operator = (int rhs) { this.val = rhs; return *this; }
...
}
然而,从谷歌搜索我收集到的那里就没有办法以这种方式进行吸气。我的理解是,这是因为只能重写=运算符以将分配给变量,并且由于 int 是基本类型,我们无法覆盖其默认实现=。它是否正确?如果没有,我该如何写吸气剂?
如果这是正确的,有没有人对类似的东西有任何优雅的建议?我能找到的最近的是转换运算符重载:
class IntWrapper
{
...
operator int( ) { return this.val; }
...
}
int main ( )
{
...
b = (int) a;
...
}
对我来说虽然这看起来毫无意义,因为它几乎没有比简单的 getVal()方法更好。
感谢您的任何建议!
答案 0 :(得分:4)
您不需要强制转换来调用转换函数。一个普通的
b = a;
也会调用它。这样,我可以看到使用它比getVal
函数更方便。虽然我一般不使用转换功能。我更喜欢一个明确的getVal
函数。特别考虑这一个
struct W {
W(int);
operator int();
};
int main() {
W w = 42;
int a = true ? 0 : w; // Ambiguity! What conversion direction?
}
它很快就会失控......
答案 1 :(得分:1)
你建议的方法是去,我一直都在使用它。你不应该把一个转换为int。编译器非常聪明,可以看到b是一个int,它会自动为你调用operator int cast运算符。