【发布时间】:2016-07-13 07:09:02
【问题描述】:
我正在尝试使用自定义流运算符实现一个类,并从它继承,以便拥有一个基类和一个具有不同流的派生类。然后我重载<< 运算符以使用存储的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 什么是原始指针优势?
-
@DieterLücking 如果 Sink 类拥有指针,为什么不使用 unique_ptr?否则,您需要一个自定义的复制或移动构造函数和一个析构函数
-
.... 这就是滥用:sink 不拥有任何东西。