Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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++_Class_Operator Overloading - Fatal编程技术网

C++ 重载类本身

C++ 重载类本身,c++,class,operator-overloading,C++,Class,Operator Overloading,假设我有一个类: class foo { .... //some constructors here set val=34 .... private: int val; int & foo::operator,() { return val; } }; 我希望能够将其用作: foo bar; printf(" %d ", bar); //i need to get value of bar.val

假设我有一个类:

class foo
{
    ....
    //some constructors here set val=34
    ....
    private:
    int val;
    int & foo::operator,()
    {
      return val;
    }
};
我希望能够将其用作:

foo bar;
printf("  %d ", bar);   //i need to get value of bar.val
                        //with just using bar itself with
                        //using an overloading
                        //but , overloading does not work
                        //i need to get 34 without using bar.val
                        //i need this without any getter 
                        //i need val to be private
问题:这种过载可能吗?如果是,如何进行

我试过:

int foo::operator int()
{
    return val;
}
operator int() const { return val; } 
但是它说“在转换函数上可能没有指定返回类型”:(

我试过:

int foo::operator int()
{
    return val;
}
operator int() const { return val; } 
转换仅在printf&cout之外工作

 int e=foo;
 printf(" %d ",e); //works 

不要重载逗号或类似的东西。
printf
具有省略号参数,因此它接受您提供给它的任何内容,您必须确保您提供的内容是正确的。保持简单:

class foo
{
    ....
    //some constructors here set val=34
    ....
private:
    int val;
public:
    int value()
    {
      return val;
    }
};

int main()
{
    foo bar;
    printf("  %d ", bar.value());   //you get value of bar.val
}
printf
不会调用工具栏上的任何运算符(包括转换运算符),因此这些运算符对您没有帮助。即使您有
operator int()
,您仍然应该这样编写:

    printf("  %d ", (int)bar);   //you get value of bar.val
这看起来不太好看。甚至:

    printf("  %d ", +bar);   //you get value of bar.val

最令人困惑。

不要重载逗号或其他可怕的东西。
printf
具有省略号参数,因此它接受您提供给它的任何内容,您必须确保您提供的内容是正确的。保持简单:

class foo
{
    ....
    //some constructors here set val=34
    ....
private:
    int val;
public:
    int value()
    {
      return val;
    }
};

int main()
{
    foo bar;
    printf("  %d ", bar.value());   //you get value of bar.val
}
printf
不会调用工具栏上的任何运算符(包括转换运算符),因此这些运算符对您没有帮助。即使您有
operator int()
,您仍然应该这样编写:

    printf("  %d ", (int)bar);   //you get value of bar.val
这看起来不太好看。甚至:

    printf("  %d ", +bar);   //you get value of bar.val

最令人困惑。

您不能重载一个类,但可以使用转换运算符,使其根据上下文中的预期参数自动转换为不同的类型。在您的情况下,由于
val
是一个
int
,您将重载到
int
的转换,如下所示:

operator int() const { return val; }
现在,只要需要
int
,并且提供
foo
,就会应用此转换

有一些限制。例如,如果将
foo
传递给对应参数类型为泛型的函数模板,则该位置不会进行转换。转换也不会影响不强制类型的其他表达式。例如,如果
f
为type
foo
,则
&f
将始终是
foo*
类型,而不是
int*
。对于大多数实际应用程序,这正是您所需要的。但是我相信C风格的变量
printf
就是这样一种情况,没有定义良好的预期类型。最好使用C++风格的调用,或者显式转换
静态转换(f)

如果你不能接受,那么你就陷入了麻烦:C++逻辑可以推断出你需要一个<代码> int >代码>,这是因为你在一些字符串常量中包含了一个%D。类型转换是编译时的事情,而格式字符串的解释是在运行时完成的。(除非以gcc的方式生成警告)。编译器不知道该参数需要什么类型,因此它不知道要执行什么转换,因此您必须以某种方式帮助他


只要这个
int val
foo
的唯一成员,并且这个类中也没有虚函数,并且没有包含任何数据成员或virtula函数的基类,那么类
foo
的对象的内存布局通常与普通整数的内存布局相同。这意味着unt即使没有任何转换,yped C-style
printf
也无法区分两者之间的区别。但是依赖于这种风格是非常糟糕的,所以我建议不要使用这种风格。

您不能重载一个类,但可以使用转换运算符,这样它会根据预期参数自动转换为不同的类型在您的情况下,由于
val
是一个
int
,您将重载到
int
的转换,如下所示:

operator int() const { return val; }
现在,只要需要
int
,并且提供
foo
,就会应用此转换

有一些限制。例如,如果将
foo
传递给对应参数类型为泛型的函数模板,则该位置不会进行转换。转换也不会影响不强制类型的其他表达式。例如,如果
f
为type
foo
,则
&f
将始终是
foo*
类型,而不是
int*
。对于大多数实际应用程序,这正是您所需要的。但是我相信C风格的变量
printf
就是这样一种情况,没有定义良好的预期类型。最好使用C++风格的调用,或者显式转换
静态转换(f)

如果你不能接受,那么你就陷入了麻烦:C++逻辑可以推断出你需要一个<代码> int >代码>,这是因为你在一些字符串常量中包含了一个%D。类型转换是编译时的事情,而格式字符串的解释是在运行时完成的。(除非以gcc的方式生成警告)。编译器不知道该参数需要什么类型,因此它不知道要执行什么转换,因此您必须以某种方式帮助他


只要这个
int val
foo
的唯一成员,并且这个类中也没有虚函数,并且没有包含任何数据成员或virtula函数的基类,那么类
foo
的对象的内存布局通常与普通整数的内存布局相同。这意味着unt即使没有任何转换,yped C-style
printf
也无法区分两者之间的区别。但依赖这种风格确实很糟糕,因此我建议不要使用这种风格。

不,这是不可能的

首先,逗号运算符在这里不适用,因为逗号用于分隔printf参数,它优先于用作运算符的逗号

添加转换运算符没有帮助,因为声明