重载类本身
Overload the class itself
假设我有一个类:
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
的唯一成员,并且这个类中也没有虚拟函数,并且存在具有任何数据成员的基类或虚拟函数,那么类foo
的对象的内存布局通常与普通整数的内存布局相同。这意味着,即使没有任何转换,非类型化的C样式printf
也无法区分。但依赖这种方式真的很糟糕,所以我建议不要使用这种方式。
不要重载逗号或类似的可怕内容。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参数,它优先于用作运算符的逗号。
添加转换运算符没有帮助,因为printf的声明是
printf(const char *,...);
这意味着编译器不知道参数应该是什么类型(除了第一个),所以它不会进行任何转换。
- 继承函数的重载解析
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载操作程序时出错>>用于类中的字符串 memebr
- 一个关于在C++中重载布尔运算符的问题
- 不同翻译单元中不可重载的非内联函数定义
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 将重载的成员函数传递给函数模板
- c++:可变模板和函数重载
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 重载==不适用于二进制树
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 正在尝试重载二进制搜索树分配运算符
- 重载Singly Linked List中的赋值运算符
- 取消引用运算符不能重载