J'essaie d'implémenter une classe avec un opérateur de flux personnalisé, et en hérite pour avoir une classe de base et une dérivée avec des flux différents. Ensuite, je surcharger l'opérateur <<
pour utiliser ostream
stocké.Ostream personnalisé imprime seulement la dernière chaîne de `` `chaîne
Ceci est un exemple de travail du code:
#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;
}
Avec le Sink class
j'écris sur la console, avec FileSink
sur un fichier.
Le problème est qu'avec ce code j'imprime seulement la dernière chaîne de chaque instruction.
Dans la console, je vois sortie suivante:
second console string
alors que dans le fichier que je peux voir cette sortie:
second file string
Ce que je fais mal et comment puis-je imprimer la sortie attendue ?
Un bon exemple pour abuser de std :: unique_ptr (un pointeur simple serait juste ici) –
@ DieterLücking Qu'est-ce qu'un avantage de pointeur brut? – ilotXXI
@ DieterLücking si la classe Sink possède le pointeur, pourquoi ne pas utiliser un unique_ptr? Sinon, vous avez besoin d'une copie personnalisée ou d'un constructeur de déplacement, et d'un destructeur –