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
为typefoo
,则&f
将始终是foo*
类型,而不是int*
。对于大多数实际应用程序,这正是您所需要的。但是我相信C风格的变量printf
就是这样一种情况,没有定义良好的预期类型。最好使用C++风格的调用,或者显式转换静态转换(f)
如果你不能接受,那么你就陷入了麻烦:C++逻辑可以推断出你需要一个<代码> int >代码>,这是因为你在一些字符串常量中包含了一个
只要这个
int val
是foo
的唯一成员,并且这个类中也没有虚函数,并且没有包含任何数据成员或virtula函数的基类,那么类foo
的对象的内存布局通常与普通整数的内存布局相同。这意味着unt即使没有任何转换,yped C-styleprintf
也无法区分两者之间的区别。但是依赖于这种风格是非常糟糕的,所以我建议不要使用这种风格。您不能重载一个类,但可以使用转换运算符,这样它会根据预期参数自动转换为不同的类型在您的情况下,由于val
是一个int
,您将重载到int
的转换,如下所示:
operator int() const { return val; }
现在,只要需要int
,并且提供foo
,就会应用此转换
有一些限制。例如,如果将foo
传递给对应参数类型为泛型的函数模板,则该位置不会进行转换。转换也不会影响不强制类型的其他表达式。例如,如果f
为typefoo
,则&f
将始终是foo*
类型,而不是int*
。对于大多数实际应用程序,这正是您所需要的。但是我相信C风格的变量printf
就是这样一种情况,没有定义良好的预期类型。最好使用C++风格的调用,或者显式转换静态转换(f)
如果你不能接受,那么你就陷入了麻烦:C++逻辑可以推断出你需要一个<代码> int >代码>,这是因为你在一些字符串常量中包含了一个
只要这个
int val
是foo
的唯一成员,并且这个类中也没有虚函数,并且没有包含任何数据成员或virtula函数的基类,那么类foo
的对象的内存布局通常与普通整数的内存布局相同。这意味着unt即使没有任何转换,yped C-styleprintf
也无法区分两者之间的区别。但依赖这种风格确实很糟糕,因此我建议不要使用这种风格。不,这是不可能的
首先,逗号运算符在这里不适用,因为逗号用于分隔printf参数,它优先于用作运算符的逗号
添加转换运算符没有帮助,因为声明