我想创建一个同时管理istream和ostream的类(IOObj)。我停留的部分是如何适当地重写流运算符,以便使用ostream给出IOObj io {};,io << "blah" << std::endl输出,以及使用istream给出x的io >> x输入。我编写的流运算符无法正常工作。 std::endl以及大多数其他操纵器都将被忽略。以下是我的尝试。 #ifndef IOOBJ_H_#define IOOBJ_H_#include <iostream>#include "SimpleTextUIErrors.h"namespace SimpleTextUI {class IOObj: public std::iostream {public: IOObj(std::istream& in=std::cin, std::ostream& out=std::cout): i{&in}, o{&out}, iOwner{false}, oOwner{false} {} IOObj(std::istream& in, std::ostream* out): i{&in}, o{out}, iOwner{false}, oOwner{true} {} IOObj(std::istream* in, std::ostream& out): i{in}, o{&out}, iOwner{true}, oOwner{false} {} IOObj(std::istream* in, std::ostream* out): i{in}, o{out}, iOwner{true}, oOwner{true} {} IOObj(const IOObj&)=delete; IOObj& operator=(const IOObj&)=delete; ~IOObj() { releaseIO(); } std::istream& in() { return *i; } std::ostream& out() { return *o; } void setInput(std::istream* in); void setInput(std::istream& in); void setOutput(std::ostream* out); void setOutput(std::ostream& out); void outputSeparator() { *o << "-------------------------------" << std::endl; }protected: IOObj(IOObj&&)=default; IOObj& operator=(IOObj&&)=default;private: std::istream* i; std::ostream* o; bool iOwner, oOwner; void releaseIO() { releaseIn(); releaseOut(); } void releaseIn() { if (iOwner) delete i; } void releaseOut() { if (oOwner) delete o; }};template<typename T>inline IOObj& operator<<(IOObj& io, T output) { io.out() << output; if (io.out().fail()) throw OutputFailedError{}; if (io.out().bad()) throw OutputBrokenError{}; return io;}template<typename T>inline IOObj& operator>>(IOObj& io, T& input) { io.in() >> input; if (io.in().fail()) throw InputFailedError{}; if (io.in().bad()) throw InputBrokenError{}; return io;}} /* SimpleTextUI */#endif /* IOOBJ_H_ */ 最佳答案 诀窍是还要在操纵器的情况下编写一个函数(如std::endl)。我添加了以下代码: inline IOObj& operator<<(IOObj& io, std::ostream& (*manip) (std::ostream&) ) { io.out() << manip; if (io.out().fail()) throw OutputFailedError{}; if (io.out().bad()) throw OutputBrokenError{}; return io;}不幸的是,此代码与我的代码中的同样,代码对于>>运算符可能还需要另一个这样的函数,但是逻辑将几乎相同。关于c++ - C++:将istream和ostream +覆盖流运算符捆绑在一起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32088464/
10-09 05:30