带有重载=运算符的C ++包装器

时间:2010-03-03 22:34:49

标签: c++ operator-overloading accessor

我正在尝试围绕 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()方法更好。

感谢您的任何建议!

2 个答案:

答案 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运算符。