Zum Inhalt springen

Janosh

Mitglieder
  • Gesamte Inhalte

    6
  • Benutzer seit

  • Letzter Besuch

  1. Ehrlich gesagt, wo der in bzw. nicht in meiner Klasse steht, war mir jetzt erstmal egal. Es ging um funktionieren oder nicht. Danke für die Erklärung. Ich hab gemeint, dass es eine Instanz für beide CPPs ist. Denkfehler meinerseits. Genau die Definition hat mir in meiner ganzen Rumprobiererei immer gefehlt. Damit funktioniert es endlich. Ich hab es sogar noch so erweitert, dass ich in der Object.cpp eine leere Dummyfunktion definiert hab, auf die der Funktionspointer anfangs zeigt, damit ich im Falle einer Nicht-Initialisierung des Pointers im Main keinen Absturz wegen Schreiben an Adresse 0000 bekomme. Nochmal herzlichen Dank an alle für die schnelle und so ausführliche Hilfe. Ich hab wieder ne Menge gelernt und vor allem mein Problem lösen können. Ihr seid klasse. Liebe Grüße, Janosh
  2. Hi nochmal, ich habe zur Verdeutlichung jetzt mal mein Problem in einer neuen Solution zusammengefasst. Vielleicht könnt ihr ja mehr damit anfangen, wenn ihr das Problem in Code vor euch habt. Ich wär euch wirklich sehr dankbar, wenn ihr mir helfen könntet, eine Lösung für mein Problem zu finden. Gerne auch direkt in Quellcode. Danke und viele Grüße, Janosh LogError.zip
  3. Ich habe von meiner Klasse nur 1 Instanz. Das würde die Idee mit einem statischen Instanzpointer realisierbar machen. Muss ich ausprobieren. Deshalb kann ich ja auch die Klasse darin nicht bekanntgeben (was ich eh nicht gewollt hätte, auch wenn es in CPP geschrieben wäre).
  4. Der Gedankengang an sich macht schon Sinn. Meine "Logger-Klasse" ist mein Dialog, in den alles eingebettet wird. Die Logger-Funktion, die Teil der Dialogklasse ist, besteht momentan nur aus einem fprintf, in dem der input-string an den filepointer (Klassenmember) übergeben wird. Meine Dialogimplementierung ist ja nur die momentane Verwendung dieses Objekts meines Kollegen. Wenn wir es später nochmal verwenden, kann es sein, dass wir z.B. eine vollständige C-Umgebung für eine Konsolen-Applikation verwenden. Der Sinn des gesamten Konzepts liegt darin, dass sich das Objekt nicht ändert, sondern nur der Funktionszeiger auf die Write-Funktion im "main". Mein bisheriger Ansatz hierfür war eben nur der, über einen Funktionszeiger zu gehen, was aber grad beim Zugriff auf eine Klasse Probleme macht. Das ist schon klar, aber dann hab ich ja eine neue Instanz der Klasse, wo die Membervariablen einen anderen Wert (konkret keinen initialisierten Filepointer) haben. Es ist zwar keine Klasse, auf die ich zugreifen will, sondern wie gesagt nur eine Funktion mit einem fprintf drin, aber der Sinn ist, dass man später einfach nur an dieser einen Stelle abändert, wo und wie die Informationen weiterverarbeitet werden. Natürlich wäre es kein Problem, diese Logging-Tasks in jedem Programm-Teil unabhängig voneinander zu lösen. Ich will aber erreichen, dass ich ein "Objekt" oder um es verständlicher zu betiteln eine "Funktionssammlung" einmal schreibe und dann den Status mit einer Versionsnummer einfrieren kann, trotzdem aber die Meldungen aus den Funktionen zeitnah (also direkt nach Auftreten) verarbeiten kann. Und diese Verarbeitung soll eben nach Willen des "main" bzw. der Hauptapplikation passieren.
  5. 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
  6. Hi Forum, nach einer stundenlangen Suche nach einer Lösung gebe ich auf und frage lieber einmal nach, bevor mir noch mehr Zeit verloren geht. Ich habe folgende Situation: 1) MFC dialogbasierte Anwendung 2) die zugehörige Klasse des Dialogs CDialogDlg 3) ein vollständig gekapsteltes Objekt ohne Verbindung zur Klasse CDialogDlg 4) Dialog in C++, Objekt in C geschrieben 5) MS Visual Studio 2005 Ich habe ein vollständiges Error-Handling in dem Objekt implementiert und möchte nun die Errorcodes extrahieren und in ein Logfile schreiben. Da ich aber die gesamte File-Verwaltung in meinem Dialog belassen möchte, wollte ich dem Objekt einen Funktions-Pointer auf eine Member-Funktion der Dialogklasse übergeben. Dann hätte das Objekt über den Pointer direkt die Memberfunktion von CDialogDlg aufgerufen und die Message würde gelogged werden. Mein großes Problem besteht nun darin, dass das Objekt nichts von meiner Klasse wissen darf, damit ich das Objekt flexibel in allen möglichen Umgebungen benutzen kann, auch mal unter einer direkten C-Konsolen-Applikation. Ist es irgendwie möglich, dass die Klasse dem Objekt einen wie auch immer gearteten Zugang zu ihrer Memberfunktion "void WriteLog (char*)" gibt? Ich habe zwar schon viele Lösungen gefunden, aber immer war Voraussetzung, dass die beiden Partner sich gegenseitig kannten. Sollte es nicht gehen, wäre ich auch für Vorschläge offen, wie ich mein Problem lösen könnte. Ich hoffe, ihr könnt mir helfen. Danke schonmal an alle, die sich die Zeit nehmen. Viele Grüße, Janosh

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...