2013-12-19 14 views
9

Ich bin auf eine Frage gestoßen, die ich selbst nicht beantworten kann. Auch auf Google und hier habe ich keine Antwort gefunden. Sprich, ich will „ein Objekt prüfen Gültigkeit“ in eine if-Klausel, etwa so:Wenn ein Objekt sowohl `operator!` Als auch `operator bool` liefert, was im Ausdruck`! Obj` verwendet wird?

MyClass myObject; 

// [some code, if any] 

if (!myObject) 
{ 
    // [do something] 
} 

MyClass Lassen Sie etwas wie folgt definiert werden:

class MyClass 
{ 
public: 
    MyClass() { }; 
    virtual ~MyClass() { }; 
    bool operator!() 
    { 
     return !myBool; 
    }; 
    operator bool() 
    { 
     return myBool; 
    }; 
private: 
    bool myBool = 0; 
}; 

Meine Frage ist nun: die eine von Die überladenen Operatoren werden tatsächlich in dieser if-Klausel verwendet? Wie auch immer, das Ergebnis ist offensichtlich dasselbe.

+0

Ich denke, es wird auf dem Weg des geringsten Widerstandes gehen, und rufen Sie 'Operator!' ... – StoryTeller

+2

Denken Sie nicht über Überlastung Bool, bis Sie dies gelesen haben: http://StackOverflow.com/Questions/6242768/is-the-safe-bool-idiom-obsolete-in-c11 – Bathsheba

+1

Ja, mach einfach den 'operator bool' und mache es explizit. Wie auch immer, 'operator!' Erfordert keine Konvertierungen. 'operator bool' erfordert eine benutzerdefinierte Konvertierung. – chris

Antwort

8

Es wird operator! verwenden.

Eine Funktion, deren Parametertypen mit den Argumenten übereinstimmen, wird vor einer Funktion ausgewählt, die Typkonvertierungen erfordert.

2

Sie werden feststellen, dass operator ! ausgeführt wird, weil es die direkteste Auflösung ist. Wenn es stattdessen operator bool verwendet, müsste es zuerst den Konvertierungsoperator aufrufen und dann das separat darauf anwenden.

Als allgemeine Regel ist es eine gute Idee, diese Situation zu vermeiden. Es ist im Allgemeinen besser, nur die bool Umwandlung zu definieren, weil genau das ist, was Sie Ihre logischen Operatoren auf, statt MyClass direkt handeln möchten. Die Definition von beiden erzeugt ein kleines Lesbarkeitsproblem und ist eine Form der redundanten Code-Duplizierung (die in Zukunft zu Programmierfehlern führen kann).

+0

Ich bin nicht einverstanden mit der Redundanz, die Sie im letzten Teil beschrieben haben. 'operator bool()' ist ein Konvertierungsoperator. Eine Anweisung wie 'bool myTest = myObject;' ohne den vorhandenen 'operator bool()' funktioniert nicht. – poljpocket

+1

Ich glaube, du hast mich falsch verstanden. Ich meinte, dass das Definieren von 'operator bool' ** und **' operator! 'Effektiv Code-Duplikation ist, weil Sie die gleiche (wenn auch invertierte) Logik unnötigerweise replizieren. –

Verwandte Themen