Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载运算符=在c++;_C++_Class_Operator Overloading_Assignment Operator - Fatal编程技术网

C++ 重载运算符=在c++;

C++ 重载运算符=在c++;,c++,class,operator-overloading,assignment-operator,C++,Class,Operator Overloading,Assignment Operator,我正在写一个这样的课程: class Digit { private : int *ref; public : Digit (int a) : ref(&a) {} int get_val () { return (*ref); } Digit operator= (int &a) { if (a <

我正在写一个这样的课程:

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);
        }
    };
int operator= (int &a, Digit &d)
{
    a = d.get_value();
    return a;
}
但我得到了一些错误:
'int operator=(int&,Digit&)'必须是非静态成员函数


我怎样才能解决这个问题?我怎样才能用2个参数重载operator=呢?

如果我理解正确的话,我想您是在试图将数字的值作为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;
}
如果要将数字隐式转换为整数,可以使用

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;
}
#包括
无效打印(int x)
{

如果我理解正确的话,我想你是想把数字的值作为int来获取

您不打算为此使用运算符=,因为运算符=用于分配给类。您希望从类中提取一个值

您的方法:

 int get_val ()
 {
    return (*ref);
 }
已经这样做了。但是,它应该是

int get_val () const
{
    return (*ref);
}
因为它不会更改任何类成员的值

用途如下:

int main()
{   
    Digit digit(5);
    int myInt = digit.get_value();
    return 0;
}
如果要将数字隐式转换为整数,可以使用

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;
}
#包括
无效打印(int x)
{

std::cout您真正需要的可能是
操作符int()


然后您可以编写
int a=d;
假设
d
类数字

您真正需要的可能是
运算符int()


然后您可以编写
inta=d;
假设
d
类数字

为什么
ref
是指针?(构造函数返回时它也是无效的。)而不是思考“如何重载赋值运算符”,而是思考“如何将
数字
隐式转换为
int
”@molbdnilo我必须用[]运算符编写一个类,该运算符返回数字,这样我们就可以像这样使用它:a[10]=5;(a的某个成员更改为5。)@timaru我想是的。所以没有办法做到这一点?@IAMB5445——似乎您需要正确记录您正在寻找的操作。您当前的代码有多个问题,一个是使用指向临时对象的指针,第二个是非正统用法
operator=
返回一个新对象,而不是
*这个
通过引用,即。e、 返回一个
日期&
,而不是
日期
ref
为什么是指针?(构造函数返回时它也是无效的。)与其思考“如何重载赋值运算符”,不如思考“如何隐式地将
数字
转换为
int
”@molbdnilo我必须用[]运算符,它返回数字以便我们可以像这样使用它:a[10]=5;(a的某些成员更改为5。)@timaru我想是的。所以没有办法做到这一点?@IAMB5445——似乎您需要正确记录您正在寻找的操作。您当前的代码有多个问题,一个是使用指向临时对象的指针,第二个是非正统用法
operator=
返回一个新对象,而不是
*这个
通过引用,即。e、 返回一个可以解决立即问题的
Date&
,而不是
Date>。这将解决立即出现的问题,但一旦程序被更多地参与,其中
int
数字
正在传递和返回,铸造操作人员更头疼。可能会出现“沉默”转换在你最不希望发生的地方进行。@PaulMcKenzie,这可以通过使操作符
显式
来解决。非常感谢!这解决了我的问题。这将解决眼前的问题,但一旦程序变得更复杂,在
int
Digit
中传递并返回
运算符,就可以进行操作更令人头痛的是,可能会有“沉默”转换在你最不希望发生的地方进行。@PaulMcKenzie这可以通过使运算符
显式
来解决。非常感谢!这解决了我的问题。我正在编写头文件,其他人将编写主函数。我正在编写头文件,其他人将编写主函数。