Stilfrage



  • hi,
    sollte man seiner Klasse eigentlich immer eine init()- und ein destroy()-Funktion zur Verfügung stellen? Ein Kumpel sagte mir, dass das besser sei als Konstruktor und Destruktor. Wenn dies stimmt, wo rufe ich dann diese Funktionen auf und lasse ich den Konstruktor und Destruktor dann einfach weg?

    Tschau Gartenzwerg



  • Was für einen Vorteil sollten init()/destroy() Methoden haben?

    Man verschenkt beim Initialisieren (wg. Default-Ctor-Aufruf) jeweils einen Defaultkonstruktoraufruf sämtlicher Member der Klasse und es ist mühselig, immer selbstständig die destroy() Methode aufzurufen.



  • Bei einem Singelton macht das schon sinn, wenn du sicherstellen
    willst das nur eine Instanz der Klasse gebildet werden kann.
    Dann hat man einen privaten Construktor den du mittels eine
    create/init Funktion aufrufst.

    Devil



  • Das ist aber ein Sonderfall. Außerdem gibt die Method in dem Fall ja dann nur ein schon längst erzeugtes Objekt zurück.



  • lol, deine antworten sind echt die besten...



  • Gartenzwerg: Ist dein Kumpel zufällig Pascalprogrammierer?



  • hi,
    er macht Informatikunterricht in der Schule. Die habe das Schuljahr mit Turbo Pascal begonnen und sind jetzt bei C++. C++ soll auch noch im nächsten Jahr weitergehen.

    Also macht es in den meisten Fällen kein Sinn, eine init()- und destroy()-Funktion in die Klasse mit einzubauen?

    Tschau Gartenzwerg

    PS: Die Vorteile konnte er mir auch nicht nennen, er sagt da habe er gerade nicht aufgepasst, aber es ist 100%ig besser. Nun da ich noch nie etwas davon gehört hatte, wollte ich mal nachfragen ob er recht hat oder nicht.

    [ Dieser Beitrag wurde am 24.06.2003 um 06:22 Uhr von Gartenzwerg editiert. ]



  • Hör nicht auf Leute, die sagen: 100% isses so besser, frag mcih aber net wieso, weil ich eigentlich kein Plan hab.



  • Hör insbesondere nicht auf Leute, die einen Stil aus einer Sprache auf eine andere übertragen wollen. Konstruktoren und Destruktoren werden in Turbo Pascal nicht automatisch aufgerufen, was dazu führt, dass man immer folgende typische Sequenz wiederfindet:

    var foo: SomeClass;
    begin
      foo.Init;
      foo.DoSomething(bar);
      foo.Done
    end;
    

    Offensichtlich ist das in C++ nicht notwendig. Sinnvoll wär es auch nicht. Kannst dich ja mal bei C++ Gurus (Herb Sutter, Bjarne S., usw.) umgucken, wie die das handhaben 😉



  • hi,
    danke für die Hinweise!

    @dEUs: Den Rat werd ich mir zu Herzen nehmen.

    Tschau Gartenzwerg



  • Wenn man ein Logging benutzt kann man im dtor mittels einer Hilfsvariable
    entscheiden ob die Klasse schon beendet wurde und einen Vermerk ins Log
    schreiben. Ist aber nur ne Spielerei.

    Ein anderer Vorteil ist das man die Klasse auch mitten in einer Funktion
    beenden kann, um z.B. Rescourcen freizugeben. Ist aber nur was für Ungeduldige.
    Und man muss aufpassen, dass eine Rescource nicht 2x freigegeben wird.



  • Original erstellt von C Newbie:
    Ein anderer Vorteil ist das man die Klasse auch mitten in einer Funktion
    beenden kann, um z.B. Rescourcen freizugeben. Ist aber nur was für Ungeduldige.
    Und man muss aufpassen, dass eine Rescource nicht 2x freigegeben wird.

    meinst du

    code;
    code;
    {
      ifstream datei(foo);
      mah_was(datei);
    }
    code;
    

    geil, oder?

    ohne den ganzen quatsch mit detroy und init

    wenn man Ctor und Dtor schon hat, dann soll man auch die vorteile verwenden...

    Ich würd ja auch gern was zu deinem 'Logging'-Argument sagen, aber ich kapiers nicht.

    BTW: RAII rules!



  • Hab ja auch nie behauptet das man unbedingt Init/Exit Funktionen braucht.
    Wer sie braucht benutzt sie wer nicht der dann halt nicht.

    Zum Logging:

    class Wichtig
    {
     bool isEnded;
    
    public:
     Wichtig() {isEnded = false;}
     void Exit() {isEnded = true;}
     ~Wichtig() 
     {
       if(!isEnded)
       {
         log("Hast Wichtig nicht beendet böse");
         exit();
       }
     }
    
    };
    


  • Man kann damit also Fehler erkennen, die man ohne das nicht hätte? 😃



  • Genau. Wie gesagt ist nur ne Spielerei.



  • Original erstellt von C Newbie:
    Genau. Wie gesagt ist nur ne Spielerei.

    ne sinnlose

    sobald man status werte hat die anzeigen ob das objekt gültig ist oder nicht, sollte man nochmals darüber nachdenken (meistens ists n design fehler)



  • Ich werde diesen Rat in Zukunft berücksichtigen.

    Auch für sinnlose Spielereien 😉



  • Ist nicht immer eine sinnlose Spielerei. In STL Containern kann es sehr hilfreich sein, wenn man nicht über Pointer die Klassen hält. Sonst wird nach dem CopyCTor immer der DTor aufgerufen, und die Initialisierten sachen drin werden überschrieben usw.



  • Erklär ...

    Hört sich irgendwie schmutzig an was du vorhast, aber du klingst, als würdest du das ständig machen:)



  • klingt so abwegig, daß ich gar nicht abwarten muss, was er genau vor hat.


Anmelden zum Antworten