Werbung

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

[C++] Konstruktoren richtig schreiben

Jeder schreibt sie - aber wie schreibt man sie richtig?

  1. -AB-

    -AB- Well-Known Member c-b Team

    -AB- hat eine neue Ressource erstellt:

    [C++] Konstruktoren richtig schreiben - Jeder schreibt sie - aber wie schreibt man sie richtig?

    Weitere Informationen zu dieser Ressource...
  2. coding-board

    coding-board Member

    Werbung
  3. German

    German Well-Known Member c-b Experte

    Hallo -AB-
    Meinst du mit Codeblock den Rumpf des Konstruktors?
    Also, ist es legitim Werte aus der Initialisierungsliste bereits im Rumpf zu prüfen?:
    Code (C++):
    Quelltext kopieren
    1.  
    2. myClass::myClass()
    3.   : myVar(myFunction())
    4. {
    5.   if (!myVar)
    6.   {
    7.     // error handling here
    8.   }
    9. }
    10.  
  4. -AB-

    -AB- Well-Known Member c-b Team

    Klar. So kannst du sicher gehen, dass du immer ein valides Objekt konstruiert hast. Wobei das Error-Handling in den meisten Fällen wohl eine Exception wäre - oder ein komplizierter retry-Mechanismus, der natürlich auch wieder mit einer Exception failen kann.

    Nachteil ist, dass du myVar so aussuchen musst, dass ein Extra Fehlerwert gespeichert werden kann. Wobei diese Information *nach* dem Konstruktor völlig egal ist, da du ja nur valide Objekte ablegst.

    Idealerweise könntest du auf Fehler schon vorher prüfen, in etwa indem du eine Methode aufrufst, die mit Sicherheit ein valides Ergebnis returned, oder aber eine Exception wirft. Das kann aber unmöglich sein, wenn es etwa API-Methoden sind - oder würde erfordern, alle Methoden einzeln zu wrappen (und dann liegt die Erkennung, welcher Wert valide ist und welcher nicht, in den Methoden, und nicht mehr im Konstruktor, was eventuell nicht wünschenswert ist.)

    Alternativ kann man auch - ein bisschen spooky - in der Memberinitialisierungsliste schon den ternären if-Operator verwenden:

    Code (C++):
    Quelltext kopieren
    1. int* tryGetInt()
    2. {
    3.     return nullptr; //always "fails"
    4. }
    5.  
    6. struct test
    7. {
    8.     test() : myInt(tryGetInt() != nullptr ? *(tryGetInt()) : throw std::runtime_error("fail"))
    9.     {}
    10.  
    11.     const int myInt;
    12. };
    In dem Fall erspart man sich, einen Member zu halten der invalide sein kann. Bei einem unsigned int - welcher Wert steht für invalid? Sind nicht alle prinzipiell möglich? (Gut, dafür gibt es ja auch Dinge wie boost::optional, aber.... Lesbarkeit, Objektgröße und Aufrufskosten leiden darunter)
    Natürlich leidet auch die Lesbarkeit wenn man x Member in der Initialisierungsliste per ?-Operator alle testet - aber dann ist eventuell doch schon wieder das Design nicht optimal ;)
    German gefällt das.
  5. German

    German Well-Known Member c-b Experte

    Bei mir sind es da hauptsächlich wieder WinAPI Funktionen, die bspw. ein Handle zurück geben, auf die meine Frage gezielt hat. Die schlagen zwar so selten fehl, dass es mir selbst noch nie untergekommen ist, trotzdem frage ich immer den Fehlerfall ab. Bislang habe ich das erst in den Methoden gemacht, ist aber eigentlich unsinnig. Erzeugt wieder zig Coderedundanzen, die man sich sparen kann, wenn man gleich einmalig im Konstruktor prüft und es macht auch keinen Sinn einen invaliden Wert weiter zu halten.
    Der Rest (ternäre Operationen & Co.) ist mir geläufig. Mit Exceptions habe ich bislang kaum gearbeitet, bisher konnte ich auch immer recht gut das Fehlschlagen in den Rückgabewert packen. Bei einem unsigned ist es am Ende auch nur eine Plausibilitäts- bzw. Definitionsfrage.
Die Seite wird geladen...
Ähnliche Themen - [C++] Konstruktoren richtig Forum Datum
[C++] Webseiten Inhalt über Socket empfangen C/C++ 24. Juli 2017
[C++] Nummernformat ändern Ressourcen Diskussionen 15. Januar 2017
[C++] Funktion - Templatisierung ohne Überladung/Spezialisierung? C/C++ 20. November 2016
[C++] GetInput Funktionstemplate - Auf Benutzereingabe warten und in spezifizierten Typ konvertieren Ressourcen Diskussionen 15. März 2016
[C++] Multithreading? Einfache Erklärung C/C++ 28. November 2015