假设我有一个类:
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; }
转换仅在 printf 和 cout 之外有效。
int e=foo;
printf(" %d ",e); //works
最佳答案
你不能重载一个类,但你可以使用一个转换运算符,这样它就会根据上下文中的预期参数自动转换为不同的类型。在您的情况下,为 val
是一个 int
,您会将转换过载到 int
像这样:
operator int() const { return val; }
现在无论int
是必需的,您提供一个 foo
, 应用此转换。
有一些限制。例如,如果您传递 foo
到相应参数类型为泛型的函数模板,在那个地方不会有任何转换。转换也不会影响其他不强制类型的表达式。例如,如果 f
类型是 foo
, 然后 &f
将始终为 foo*
类型, 不是 int*
.对于大多数实际应用,这一切正是您所需要的。但我相信 C 风格的可变参数 printf
正是这样一种情况,没有明确定义的预期类型。最好使用 C++ 风格的调用,或显式转换 static_cast<int>(f)
.
如果两者都不适合您,那么您就有麻烦了:C++ 逻辑无法推断出您需要 int
的事实。在这里,仅仅因为你包含了一个 %d
在一些字符串常量中。类型转换是编译时的事情,而格式字符串的解释是在运行时完成的(除非像 gcc 那样生成警告)。编译器不知道该参数需要是什么类型,因此它不知道要执行什么转换,因此您必须以某种方式帮助他。
只要这个int val
是foo
的唯一成员,而且在这个类中也没有虚函数,也没有带有任何数据成员的基类或 virtula 函数,类对象的内存布局 foo
通常与普通整数相同。这意味着未类型化的 C 风格 printf
将无法区分,即使根本没有任何转换。但是依赖这个是非常糟糕的风格,所以我建议不要使用它。
关于c++ - 重载类本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12334647/