代码之家  ›  专栏  ›  技术社区  ›  Mac Umer

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

  •  1
  • Mac Umer  · 技术社区  · 14 年前

    我正在尝试开发一个非常简单(目前)的包装类 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; }
        ...
    }
    

    然而,从我收集的一点谷歌信息来看,没有办法用这种方式做一个getter。我的理解是,这是因为=运算符只能重写为 一个变数,自从 int 是一个基元类型,我们不能重写它的默认实现=。这是对的吗?如果没有,我该怎么写呢?

    如果这是正确的,有人对类似的东西有什么优雅的建议吗?我能找到的最接近的是重载转换运算符:

    class IntWrapper
    {
        ...
        operator int( ) { return this.val; }
        ...
    }
    
    int main ( )
    {
        ...
        b = (int) a;
        ...
    }
    

    但对我来说,这似乎毫无意义,因为它只不过是一个简单的 GETVAL() 方法。

    谢谢你的建议!

    2 回复  |  直到 14 年前
        1
  •  4
  •   Johannes Schaub - litb    14 年前

    调用转换函数不需要强制转换。平原

    b = a;
    

    也会调用它。这样的话,我可以看出这比 getVal 功能。虽然我一般不使用转换函数。我更喜欢直白的 格瓦尔 功能。特别是考虑这个

    struct W {
      W(int);
      operator int();
    };
    
    int main() {
      W w = 42;
      int a = true ? 0 : w; // Ambiguity! What conversion direction?
    }
    

    很快就失控了…

        2
  •  1
  •   miked    14 年前

    你的建议是去的路,我一直在用。您不需要将a转换为int。编译器足够聪明,可以看到b是int,它将自动为您调用运算符int cast operator。