Tracer-Klasse Vorstellung
-
soll das viel code sein?
meine projekte hatten schon 10000 /100000 und mehr zeilen, ohne abstände natürlich und ohne geschwungene klammern in die nächste zeilen so wie du.
"pff viel code mag nicht reintun mit den klammern in zeilenanfängen"
WoW rockt
-
Oh, da kann ne Menge zu sagen:
NummeriertesObjekt:
if(Testmodus)würde ich nicht machen. Benutz' stattdessen zB den Präprozessor mit NDEBUG (also baue eine Variante zum Debuggen und eine für das fertige Programm).
Inkludiere nur dort, wo es sein muss.#include <iostream>und#include <cstdlib>gehören in die Implementierungsdatei. Dort fehlt auch noch#include <cassert>.
Das assert hast du falsch verwendet, schau dir nochmal dessen Semantik an.Tracer:
Benutze '/' als Pfadtrenner. Das ist meines Wissens portabler (läuft auch unter Windows, ob \ unter Unices funktioniert kann ich grad nicht sagen).
Warum hat Tracer einen virtuellen Destruktor? Du solltest diesen Overhead dem Anwender nur aufzwingen, wenn du tatsächlich auch virtuelle Funktionen benutzt. Tust du aber nicht. Von einer solchen Klasse sollte eh nicht öffentlich geerbt werden.
Benutze im Destruktor std::find um this zu finden statt deiner selbst gebauten Lösung.Generell sind ein paar Sachen designtechnisch nicht so glücklich. Du solltest z.B. Ausgabe nicht zwingend durch std::cout schicken, genauso wenig wie zwingend in eine Datei. Benutz ostream-Referenzen dafür und wie gesagt sollte von Tracer und NummeriertesObjekt höchstens protected geerbt werden.
-
.filmor schrieb:
Benutze '/' als Pfadtrenner. Das ist meines Wissens portabler (läuft auch unter Windows, ob \ unter Unices funktioniert kann ich grad nicht sagen).
das möchte ich unterstreichen. der backslash funktioniert definitiv nicht unter unixoiden. und ich glaube (hoffe), dass microsoft sich von dem backslash in einem der nächsten windows-dateisysteme abwendet.
-
Warum sollte sich Microsoft denn den Unix-Systemen anpassen? Außerdem ist der Pfadtrenner bei Windows auch noch Länderspezifisch. Bei einem japanischen Windows ist es z.Bsp. das Yen-Zeichen.

-
Braunstein schrieb:
Warum sollte sich Microsoft denn den Unix-Systemen anpassen? Außerdem ist der Pfadtrenner bei Windows auch noch Länderspezifisch. Bei einem japanischen Windows ist es z.Bsp. das Yen-Zeichen.

weil es mir als entwickler dann weniger kopfschmerzen bereitet
-
Das ist ein gutes Argument.

Wir können ja mal eine Petition an Microsoft schicken. Das mit dem Yen-Zeichen hatte mir auch einiges an Arbeit eingebracht.
-
Braunstein schrieb:
Das ist ein gutes Argument.

Wir können ja mal eine Petition an Microsoft schicken. Das mit dem Yen-Zeichen hatte mir auch einiges an Arbeit eingebracht.ich glaube das wird nix helfen

-
Wie ich schon in einem Interview bekannt gab habe sogar ich mich von Windows abgewendet, ist einfach ein ewiges rumgekrampfe.
Ich finde die Tracer-Klasse so eher weniger nützlich, da sie nur sehr wenige Informationen bereit stellt, wenn ich Probleme haben mit dem Lebenszyklen von Objekten, dann brauche ich eigentlich immer noch zusätzlich ein Stacktrace und mehrere Checkpoints an kritischen Stellen um zu wissen wo gerade wie verzweigt wurde, sonst weiß ich ja nachher gar nicht wo etwas schief gegangen ist.
Einfach den Speicher nach Leaks zu überwachen bietet ja inzwischen jeder Compiler im Debug-Modus an, ebenso Speicherchecks (also Index-Out-Of-Bounds oder Off-By-One Fehler).
Am angenehmsten unter Windows finde ich das Erstellen eines Minidumps, mit dem enthaltenen Fehler, dann kann man ganz in Ruhe sich hinsetzen und den Fehler analysieren, ist für mich also das ultimative Tracert, wenn man so will.
Falls du Linux benutzt, hast du dir mal strace angesehen, eine Ausgabe wie sie dort erfolgt beinhaltet auch weit mehr Informationen als dein Trace-Tool. Schau dir das mal an und versuch das in deine Bibliothek mitaufzunehmen.
P.S. Ist der Header im ersten Posting die gesamte Trace-Bibliothek?
-
Hey super danke, genauso so eine Kritik brauchte ich, damit kann ich wunderbar weiterarbeiten um das zu verbessern. Andere Frage, würdet ihr noch weitere Funktionen hinzufügen??
@.filmor
Wie meinst du das mit dem "nicht öffentlich geerbt"? Was muss ich da anders machen?
-
Falls dich das Thema interessiert, solltest du dich mal mit aspektorientierter Programmierung befassen. C++ bietet hierfür leider keinen Support (D übrigens genauso wenig). Es gibt allerdings einige Aufsätze wie zB AspectC++. Damit lassen sich Sachen wie Debug-Handling viel sauberer implementieren, weil sie von der eigentlichen Programmlogik getrennt werden.
Bezüglich "nicht öffentlich geerbt", .filmor meint, deine Klasse Tracer ist keine typische Basisklasse, also ist der virtuelle dtor überflüssig. Virtuelle dtors machen ja nur dort Sinn, wo vererbt wird, also die Klasse als Basisklasse benutzt wird, und das öffentlich (public). Wird nicht öffentlich vererbt, kann auf die Instanz der Basisklasse auch nicht zugegriffen werden und non-virtual bietet keine potenzielle Gefahr.
-
Aber wenn ich, angenommen ich mache es, jede meiner neugeschriebenen Klassen von der Tracer Klasse erben lasse ist es dann keine Basisklasse? Oder ist es deswegen keine Basisklasse weil ich in keiner meiner erbenden Klasse eine Methode von der Tracerklasse überschreibe??
-
Firefighter schrieb:
Aber wenn ich, angenommen ich mache es, jede meiner neugeschriebenen Klassen von der Tracer Klasse erben lasse ist es dann keine Basisklasse?
Doch. Nur sollst du ja nicht öffentlich erben. Oder möchtest du Zugriff auf die Basisklasse (Tracer) in der erbenden Klasse erlauben? Ich persönlich würde das eher als falsches Design empfinden. Deine Tracer Klasse soll ja im Hintergrund arbeiten, ohne dass jemand etwas davon mitbekommt, richtig?
-
stimmt...da hast du natürlich vollkommend recht. Aber ich will ehrlich sein, kann ich denn eine Klasse private erben lassen? habe bissher nur public erben lassen, geht private wirklich?
-
Statt
class Derived : public Base {...};nimmst du eben
class Derived : private Base {...};
-
Ok aber kann ich denn dan trotzdem noch den Konstruktor von Trace aufrufen? weil den brauche ich doch oder net? Laut meiner Codefiles, wird ja der Tracer konstruktor benutzt.?
-
Firefighter schrieb:
Ok aber kann ich denn dan trotzdem noch den Konstruktor von Trace aufrufen? weil den brauche ich doch oder net? Laut meiner Codefiles, wird ja der Tracer konstruktor benutzt.?
Bei private Ableitung, kannst du alles benutzen, was in der Base unter public ist, sofern also der c-tor public ist, geht das.
-
Alles klar, damit ist mein Wissensdurst vorläufig gestillt. Danke an alle die hier einen qualifizierten Kommentar da gelassen haben
