如何在类中实现提取操作符
How to implement the extraction operator in a class?
我有一个类,它将二进制文件的部分内容读入不同类型的变量中。
class Foo {
public:
size_t getSizeT();
float getFloat();
std::string getString();
private:
std::ifstream stream;
};
现在我想实现这个答案中描述的流提取操作符。
class Foo {
public:
Foo &operator>>(Foo &foo, size_t &value);
Foo &operator>>(Foo &foo, float &value);
Foo &operator>>(Foo &foo, std::string &value);
private:
std::ifstream stream;
};
代码编译失败,显示以下错误信息:error C2804: binary 'operator >>' has too many parameters
。如何正确覆盖流提取操作符?它应该区分不同的类型,并且是可链接的
作为自由函数,操作符签名应该是:
Foo& operator >>(Foo& foo, size_t& value);
作为成员函数(你的例子),它应该是:
Foo& operator >>(size_t& value);
如果您的类的一个实例是数据源,那么您有两种方式来编写输入操作符函数:要么作为一个独立的全局函数,接受两个参数,类的实例和目标对象。或者你把它写成类的成员函数,然后它只接受一个参数,即目标。
对于一个全局函数,你可以这样写,例如
class Foo { ... };
Foo& operator>>(Foo& foo, int& i)
{
// Get an integer and writes to `i` here
return foo;
}
对于成员函数,可以这样写:
class Foo
{
public:
...
Foo& operator>>(int& i)
{
// Get an integer and writes to `i` here
return *this;
}
};
我认为你写错了操作符的原因是,你可以把第一个版本,使用全局函数,写成friend函数内联在类中,在你把友元函数和成员函数的区别搞混之前,你已经看到了。
使用好友函数,如
class Foo
{
public:
...
// Notice the keyword `friend`
friend Foo& operator>>(Foo& foo, int& i)
{
// Get an integer and writes to `i` here
return foo;
}
};
成员函数和友元函数的区别很微妙,但是非常重要。
相关文章:
- 如果没有malloc,链表实现将失败
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 如何从 std::atomic 中提取指针 T<T>?
- 实现无开销push_back的最佳方法是什么
- 为什么istream不支持右值提取
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- 如何实现递归"using"/提取模板参数
- 何时应该完全实现插入器/提取器
- 实现提取和插入运算符C++
- 最快的HOG特征提取实现
- 如何从实现(.cpp文件)中提取声明(.hpp文件)
- 将多个实现提取到静态库中
- 如何在类中实现提取操作符
- C++ Linux 平台上运行时加载共享库并提取类实现