c++ - 如果您只是重新创建 ifstream 类,您如何重载运算符>>?

标签 c++ operator-overloading iostream ifstream

我的老师希望我们学习 ifstream 类及其工作原理。她给我们布置了创建一个 FileStream 包装器类的作业,该类被模板化以处理任何内容,并且可以接收文件中的任何内容。

除了无法编译之外,我已经编写了所有内容,因为我不知道如何编写 >>> 运算符并不断收到错误。这是我目前所拥有的:

template<class A>
ifstream& operator >>(FileStream<A> fs, A& x){
  fs>>x;
  return fs;
}

主要是她用来检查我们的工作,它是这样称呼的:

FileStream<Word> input;
Word temp; //word is a class we created to manipulate strings in certain ways 

while(input>> temp){
  cout<<temp<<endl;
}

如果有人能帮助我,我将不胜感激。我已经为此工作了 2 天,但我做不到。

最佳答案

template<class T>
FileStream<T>& operator >> (FileStream<T>& fs, T& value) {
  value = fs.readValueFromStream();
  return fs;
}

您的方法应该类似于上面的内容。亮点:

(请注意,我已将 A 重命名为 T 并将 x 重命名为 valueT 是通用模板参数的常用名称,而 valuex 更具描述性。)

  1. 接受 FileStream<T>& 引用。 & 确保您使用原始流对象而不是拷贝。
  2. 返回 FileStream<T>& 引用,而不是 ifstream
  3. 不是在方法中执行 fs>>x ,这只是对我们所在方法的递归调用,您需要编写代码来实际从流中读取一个项目并将其放入 value 。这应该使用你的 FileStream 类的一些方法。我写了 value = fs.readValueFromStream() 但这可以是任何东西。

在这种情况下,operator >> 充当语法糖。真正的工作是由 value = fs.readValueFromStream() 行(或您实际在此处编写的任何代码)完成的。

关于c++ - 如果您只是重新创建 ifstream 类,您如何重载运算符>>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13408525/

相关文章:

c++ - `rand()` 的用处 - 或者谁应该调用 `srand()` ?

c++ - 在 C++11 中等待多个条件变量的最佳方法是什么?

java - Jexl3 中自定义类的运算符重载/定义

c++ - 为什么 cin 在包含字符串头后接受字符串输入

c++ - 通用打印功能

c++ - 在不调用 setSizeIcon() 的情况下动态调整 QIcon 的大小

java - java中的参数化适配器

C++ 为列表重载 [][]

c++ - 在模板类之外定义运算符重载

c++ - iostream 对象 cin、cout、cerr 和 clog 是如何实现的?