我想用一个自定义的流操作符实现一个类,并从它继承,以便有一个基类和派生的不同的流。然后,我使用存储的ostream
将<<
运营商超载。自定义ostream只打印`<<`链的最后一个字符串
这是代码的工作示例:
#include <string>
#include <memory>
#include <ostream>
#include <iostream>#
#include <fstream>
class Sink {
public:
Sink() {
m_stream = std::unique_ptr<std::ostream>(new std::ostream(std::cout.rdbuf()));
};
template<typename T>
std::ostream& operator<<(const T& obj) {
return *m_stream;
}
protected:
std::unique_ptr<std::ostream> m_stream;
};
class FileSink : public Sink {
public:
FileSink() {
m_stream = std::unique_ptr<std::ostream>(new std::ofstream("file.txt"));
}
};
int main() {
Sink s;
FileSink fs;
s << "First console string " << "second console string";
fs << "First file string " << "second file string";
return 0;
}
随着Sink class
我写在控制台上,与FileSink
上的文件。
问题是,使用此代码,我只打印每条指令的最后一个字符串。
在控制台中我看到以下的输出:
second console string
,而在该文件中,我可以看到这样的输出:
second file string
我做错了什么,我怎么能打印预期输出?
一个滥用std :: unique_ptr的好例子(一个简单的指针就在这里) –
@DieterLücking什么是原始指针优势? – ilotXXI
@DieterLücking如果Sink类拥有指针,为什么不使用unique_ptr?否则,你需要有一个自定义的副本或移动构造函数,以及一个析构函数 –