Я пытаюсь реализовать класс с пользовательским потоковым оператором и наследует его, чтобы иметь базовый класс и производный с разными потоками. Затем я перегружаю оператор <<
для использования сохраненных ostream
.Пользовательский ostream печатает только последнюю строку `<<` chain
Это рабочий пример кода:
#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 Что такое преимущество raw pointer? – ilotXXI
@ DieterLücking, если класс Sink владеет указателем, почему бы не использовать unique_ptr? В противном случае вам понадобится индивидуальная копия или перемещение конструктора, а деструктор –