Hi ich versuche aktuell ein Programm mit diversen Klassen zu entwickeln und will damit alle Klassen in die selbe LOG-Datei schreiben können eine Oberklasse schreiben von der alle anderen Klassen erben.
meine Header-Datei sieht wie folgt aus
class Mainfunktions
{
public:
Mainfunktions(void);
~Mainfunktions(void);
void writeLog(QString typ, QString msg);
private:
QElapsedTimer timer;
static QFile file;
};
die Implementierung wie folgt:
Mainfunktions::Mainfunktions(void)
{
timer.start();
file.setFileName("log.txt");
file.open(QIODevice::WriteOnly|QIODevice::Text);
}
Mainfunktions::~Mainfunktions(void)
{
QString text = QString::number(timer.elapsed());
writeLog("Info","Zeit von Mainfunktions Beträgt " + QString::number(timer.elapsed()) + " millisekunde");
file.close();
}
void Mainfunktions::writeLog(QString typ, QString msg)
{
QTextStream out(&file);
out << QDateTime::currentDateTimeUtc().toString() << " " << typ << ": " << msg << "\n";
}
das ganze habe ich jetzt erst einmal an eine Klasse vererbt und eingebunden will ich das ganze jetzt übersetzen erhalte ich folgende Fehlermeldung
1>mainfunktions.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""private: static class QFile Mainfunktions::file" (?file@Mainfunktions@@0VQFile@@A)".
Zudem bin ich mir beim Konstruktor und destruktor unsicher da wenn ich mehrere Klassen haben die von der Klasse erben die Datei ja mehrfach versucht wird zu öffnen bzw zu schließen.
Kann mir jemand nen kleinen Hinweis geben woher zum einen der Fehler kommt oder wie man an ein solches logging heran gehen kann so das es Funktioniert?
danke schon mal
Schubi
Logging in QFile
Re: Logging in QFile
ACHTUNG, DESIGNFEHLER!Schubi hat geschrieben:damit alle Klassen in die selbe LOG-Datei schreiben können eine Oberklasse schreiben von der alle anderen Klassen erben.
Du baust dir gerade eine Klassenhierarchie auf einem Singleton auf. Alles was loggen will muss von deiner Klasse erben. static vs. Vererben beißt sich (meistens).
Entweder konzipierst du deine Loggingklasse als Singleton (google hilft, was das ist), oder du verwendest ein bereits existierendes Logging-Framework wie z.B. log4cxx o.Ä.
Nur weil du C++ programmierst (OOP WTF) muss nicht alles mit Vererbung gelöst werden
Ach ja, deine Linker-Problem: deine static-Variable ist bisher nur deklariert. Du brauchst jetzt in einer .cpp-Datei noch eine Definition.
Re: Logging in QFile
@Schubi
Es ist allerdings nen sehr beliebter (Design)Fehler in C++ Nicht nur bei Neueinsteigern.
Die generelle Regel.
Aggregation(Composition) wenn du kannst, Vererbung wenn du musst.
Vererbung nur wenn:
- Du dich wie die Abgeleitete klasse verhalten musst, andere Klassen dich verwenden ohne zu wissen was genau du bist nterface prinzip)
- du an protected methoden rankommen musst (manchmal Designfehler den du ausbaden darfst/musst)
Wennn du verrerbst, nur um Dir die Tipparbeit der Weiterleitung von Funktionen in einen Member zu sparen, ist Dir ein Paltz in der C++ Design-Hölle sicher
Singleton kann schon die richtige Richtung sein !
Ciao ...
Es ist allerdings nen sehr beliebter (Design)Fehler in C++ Nicht nur bei Neueinsteigern.
Die generelle Regel.
Aggregation(Composition) wenn du kannst, Vererbung wenn du musst.
Vererbung nur wenn:
- Du dich wie die Abgeleitete klasse verhalten musst, andere Klassen dich verwenden ohne zu wissen was genau du bist nterface prinzip)
- du an protected methoden rankommen musst (manchmal Designfehler den du ausbaden darfst/musst)
Wennn du verrerbst, nur um Dir die Tipparbeit der Weiterleitung von Funktionen in einen Member zu sparen, ist Dir ein Paltz in der C++ Design-Hölle sicher
Singleton kann schon die richtige Richtung sein !
Ciao ...