Ich versuche, einige experimentelle Ergebnisse in einer Datei zusammenzufassen. Die Ergebnisse werden in verschiedenen C++ - Klassen und -Dateien generiert. Ich möchte sie alle in die gleiche Datei schreiben.Was ist los mit meiner Datei-Logger-Klasse in C++?
Aus diesem Grund wäre es praktisch, einen Header zu haben, der alles definiert, und dann kann ich es einfach in die Dateien einfügen, die darauf schreiben müssen. Ich sollte ein Singleton sein, also wird nicht versucht, dieselbe Datei zweimal zu öffnen.
Es sieht wie folgt aus:
#ifndef FILELOGGER_H
#define FILELOGGER_H
#include <fstream>
class FileLogger{
std::ofstream *logfile;
static FileLogger *s_instance;
FileLogger()
{
logfile = new std::ofstream();
logfile->open("~/results/experiments.txt", std::ios_base::app);
}
~FileLogger()
{
std::cout << "Destructor of logger called" << std::endl;
if(s_instance)
{
logfile->close();
delete logfile;
delete s_instance;
}
}
public:
static std::ofstream *instance()
{
if (!s_instance)
{
s_instance = new FileLogger();
}
std::cout << "got logger" << std::endl;
return s_instance->logfile;
}
};
FileLogger *FileLogger::s_instance = 0;
#endif // FILELOGGER_H
ich jetzt denken würde, dass ich gerade in einer anderen Datei:
#include "FileLogger.h"
und verwenden Sie dann
*FileLogger::instance() << "Testoutput" << std::endl;
in die Datei zu schreiben . Wenn ich es jedoch ausprobiere, wird die Datei nicht erstellt. wenn ich es per Hand erstelle, steht nichts darauf geschrieben. Ich bekomme die Ausgabe von "Got Logger", die aufgerufen wird, wenn der Logger über die Instanzmethode aufgerufen wird. Ich bemerkte auch, dass der Destruktor nie aufgerufen wird.
Warum funktioniert das nicht/Ist das ein schlechter Stil?
Ich werde der Teil „Singleton ist ein Anti-Muster“ überspringen;) Was ist das Ergebnis offen? Ihre Zeile 'FileLogger * FileLogger :: s_instance = 0;' sollte in einer cpp-Datei sein – wasthishelpful
Hat Ihre Anwendung den Schreibzugriff auf die Datei? –
Sie löschen Ihre Instanz in Ihrem Destruktor. Umgekehrt sollte das Löschen Ihrer Instanz Ihren Destruktor aufrufen. –