Hi,
also ich sehe, ich habe es noch nicht gut genug erklärt. Sorry dafür.
Zustand:
Ich habe eine Klasse, in der ich eine Memberfunktion habe, die übergebene char* in eine Datei schreibt. Also ganz simpler Aufbau:
class CDialogDlg
{
public:
CDialogDlg ();
~CDialogDlg();
void WriteString (char*);
}
Desweiteren habe ich jetzt von einem Kollegen ein gekapseltes Objekt bekommen, das komplett in C programmiert wurde und auf keinen Fall eine Instanz der Klasse bekommen darf (da es ja sonst nicht mehr vollständig gekapselt wäre).
Das Objekt ist eine Sammlung von C-Funktionen, die aber auch Meldungen wegschreiben können sollen, und zwar direkt zu dem Zeitpunkt, wenn sie auftreten. Es bringt also nichts, alle Meldungen in einem Array zu sammeln und nach der Rückkehr in die Klasse erst alles zu schreiben.
Mein Ansatz war nun, dass mein Kollege einen einfachen 'void (*WriteMsg)(char*)' Funktionspointer in seinem Objekt einbaut, den ich aus der Klasse mit der Adresse meiner WriteString-Funktion füttere. Anschließend kann er immer - falls der Funktionspointer nicht NULL ist - darauf zugreifen und seine Nachrichten loggen.
Mein Problem dabei war jetzt allerdings, dass mir der Compiler gesagt hat, dass ich von außerhalb der Klasse nicht auf ein Klassenmember zugreifen kann, ohne die Klasse bekannt zu machen.
Daraufhin hab ich es mit einer statischen Memberfunktion versucht, was daran scheiterte, dass ich dann nicht mehr auf den File-Pointer zugreifen kann, bzw. die Zeitinformation (des Programmstarts), die im Dateinamen enthalten ist.
Eine weitere Möglichkeit wäre jetzt, dass ich den Dateinamen nicht dynamisch vergebe, sondern einen festen Namen benutze. Dann könnte ich aber auch nur noch 1 Logfile benutzen und nicht mehr zwischen den einzelnen Programmaufrufen unterscheiden.
Und daraus ergeben sich nunmal meine Anforderungen, die mir so Kopfzerbrechen bereiten:
- Das Objekt (die c und h Datei meines Kollegen) darf keine Instanz oder Deklaration der Klasse bekommen, um die Kapselung nicht zu verlieren.
- Der Dateiname für die Log-Datei muss sich bei Programmstart generieren und muss ab dem Moment verwendet werden.
Ich hoffe, mein Problem ist jetzt ein wenig klarer geworden. Und nein, ich benutze kein .NET, sondern reines VC++.
Danke schonmal im Voraus.
Gruß,
Janosh