1

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

感谢您的任何建议!

4

2 回答 2

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?
}

很快就失控了……

于 2010-03-03T22:38:03.600 回答
1

您建议的方法是要走的路,我一直都在使用它。您不需要将 a 强制转换为 int。编译器足够聪明,可以看到 b 是一个 int,它会自动为您调用 operator int cast operator。

于 2010-03-03T22:40:03.923 回答