Logging in QFile

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Schubi
Beiträge: 8
Registriert: 4. Juni 2012 15:13

Logging in QFile

Beitrag von Schubi »

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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Logging in QFile

Beitrag von franzf »

Schubi hat geschrieben:damit alle Klassen in die selbe LOG-Datei schreiben können eine Oberklasse schreiben von der alle anderen Klassen erben.
ACHTUNG, DESIGNFEHLER!
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.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Logging in QFile

Beitrag von RHBaum »

@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 (Interface 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 :twisted:

Singleton kann schon die richtige Richtung sein !

Ciao ...
Antworten