重载运算符 = 在 C++ 中有两个参数

overload operator = with two arguments in c++

我正在写这样的 class :

class Digit
{
    private :
        int *ref;
    public :
        Digit (int a) : ref(&a) {}
        int get_val ()
        {
            return (*ref);
        }
        Digit operator= (int &a)
        {
            if (a < 0 || a > 9)
                throw "invalid digit assignment.";
            (*ref) = a;
            return (*this);
        }
    };

所以如果有人定义了一个数字,他不能给它赋值大于 9 或小于 0。 问题是,我还想定义另一个 = 运算符,他也可以将数字分配给某个值。 我试过这样的事情:

int operator= (int &a, Digit &d)
{
    a = d.get_value();
    return a;
}

但是我得到一些错误:'int operator=(int&, Digit&)' must be a nonstatic member function

我该如何解决这个问题?我如何用 2 个参数重载运算符 =?

如果我没理解错的话,我认为你正在尝试将 Digit 的值作为 int 获取。

您不会为此使用运算符 =,因为运算符 = 用于将 分配给 和 class。您想要从 class.

中提取一个值

你的方法:

 int get_val ()
 {
    return (*ref);
 }

已经这样做了。但是,它应该是

int get_val () const
{
    return (*ref);
}

因为它不会更改任何 class 成员的值。

用法为:

int main()
{   
    Digit digit(5);
    int myInt = digit.get_value();
    return 0;
}

如果想将Digit隐式转换为int,可以使用

operator int()
{
    return get_val();
}

这只是一个捷径。没有那个操作员,你会做这样的事情:

#include <iostream>

void Print(int x)
{
    std::cout << x << std::endl;
}

int main()
{   
    Digit digit(5);
    Print(digit.get_value());

    return 0;
}

但是使用运算符,您告诉编译器数字 class 可以像 int 一样处理(转换):

#include <iostream>

void Print(int x)
{
    std::cout << x << std::endl;
}

int main()
{   
    Digit digit(5);
    Print(digit);

    return 0;
}

你真正需要的可能是operator int().

class Digit {
   operator int() { return get_val(); }
};

然后你可以写 int a = d; 假设 dclass Digit.