【问题标题】:overload operator = with two arguments in c++ [duplicate]重载运算符=在c ++中有两个参数[重复]
【发布时间】:2023-03-13 21:12:02
【问题描述】:

我正在写这样的课程:

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 的值。 问题是,我还想定义另一个 = 运算符,他也可以将 Digit 分配给某个值。 我尝试过这样的事情:

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

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

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

【问题讨论】:

  • 为什么ref 是一个指针? (构造函数一返回也是无效的。)
  • 与其想“我怎样才能重载赋值运算符”,不如想“我怎样才能将Digit隐式转换为int”。
  • @molbdnilo 我必须用 [] 运算符编写一个返回数字的类,这样我们就可以像这样使用它:a[10] = 5; (以及对 5 进行更改的一些成员。)
  • @timaru 我想是的。所以没有办法做到这一点?
  • @iambb5445 -- 似乎您需要正确记录您正在寻找的操作。您当前的代码有多个问题,一个是使用指向临时对象的指针,第二个是 operator = 通过引用返回新对象而不是 *this 的非正统用法,即返回 Date&amp;,而不是 Date

标签: c++ class operator-overloading assignment-operator


【解决方案1】:

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

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

那么你可以写int a = d; 假设dclass Digit

【讨论】:

  • 这将解决眼前的问题,但是一旦程序变得更加复杂,intDigit 正在被传递和返回,铸造操作员就更令人头疼了。在您最不希望发生的地方可能会发生“无声”转换。
  • @PaulMcKenzie 这可以通过使操作符explicit来解决。
  • 非常感谢!这解决了我的问题。
【解决方案2】:

如果我理解正确,我认为您正在尝试将 Digit 的值作为 int 获取。

您不会为此使用 operator =,因为 operator = 用于将 分配给 类。您想从类中提取一个值。

你的方法:

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

已经这样做了。不过应该是

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

因为它不会改变任何类成员的值。

用法如下:

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

但是使用运算符,你告诉编译器 Digit 类可以像 int 一样处理(转换):

#include <iostream>

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

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

    return 0;
}

【讨论】:

  • 我在写一个头文件,别人要写main函数。
猜你喜欢
  • 2020-12-13
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
相关资源
最近更新 更多