Frage zum SafeBool Idiom



  • Hallo, ich möchte, dass meine Klasse in einer If Anweisung ausgewertet werden kann:

    if(meinObjekt) //...
    

    Intuitiv habe ich dafür den operator bool überladen. Jetzt habe ich aber gelesen, dass das kein guter Stil ist, da dann solche Anweisungen legal werden:

    meinObjekt < 15 //(meine Klasse < int) wird zu (bool < int) wird zu (int < int)
    

    Die Lösung für dieses Problem ist - laut dem Text den ich gelesen habe - das SafeBool idiom, was besagt, dass man den operator void* überladen soll. Mein Code sieht folgendermaßen aus:

    #include <cstddef> //für NULL
    
    class test
    {
       public:
        int member;
    
        operator const void* const () const
        {
            return member ? static_cast<const void*>(*this) : NULL;
        }
    };
    
    #include <iostream>
    int main()
    {
        test a; a.member = 1;
        if(a) std::cout<<"ja"<<std::endl; //Programm stürzt ab
    }
    

    Der Code compiliert zwar, stürzt aber zur Laufzeit bei der If Anweisung ab. Kann sich jemand vorstellen, wo der Fehler liegt?



  • *this//nöö, an den * glaub ich nicht.



  • Wie kann man nur so blind sein?
    Danke Volkard, das "sternchen" war einfach zu viel 😃



  • besser als void* soll noch ein memberpointer oder etwas in der art sein.



  • Wie meinst du das, pumuckl



  • Safebool schrieb:

    Wie meinst du das, pumuckl

    Es gibt zum Beispiel Funktionen, die void* nehmen.

    test t;
    FILE* fi=fopen(...);
    fwrite(t,sizeof(t),1,fi);
    

    Das vermeidet man mit noch verrückteren bool-Ersetzlingen als void const*, wenn man Lust hat.



  • Das wird ja immer komplizierter.


  • Administrator

    Safebool schrieb:

    Das wird ja immer komplizierter.

    Am einfachsten ist es, eine normale Funktion zu verwenden, welche die Prüfung durchführt und das Resultat zurückgibt. Wieso möchtest du unbedingt auf die Funktion verzichten?

    Grüssli



  • Safebool schrieb:

    Das wird ja immer komplizierter.

    Das ist so, momentan gibt es keine wirklich schöne und einfache Möglichkeit. Im neuen C++-Standard (C++0x) werden allerdings explizite Konvertierungsoperatoren eingeführt, dann ist das Bool-Idiom wirklich safe.

    Du musst dir auch überlegen, ob es dir das wert ist. Sind Beispiele wie obj < 15 nicht etwas gekünstelt? Ich mag zumindest mich nicht erinnern, aus Versehen mit irgendwelchen Objekten gerechnet zu haben. Und möchtest du mit den Zeiger-Workarounds sowas verbieten?

    bool b = obj;
    

    Aber Dravere hat Recht: Eine Funktion scheint mir im Allgemeinen am sinnvollsten. Gerade mit aussagekräftigem Funktionsnamen ist im Code auch viel ersichtlicher, was getan wird.


Anmelden zum Antworten