2016-06-21 15 views
1

Ich möchte eine WrapperClass für Strings erstellen. Ich möchte auch die Klasse der Lage sein, die Adresse des wrapperClass und die Adresse des gespeicherten (verpackt) Zeichenfolge zurück:Mehrdeutige Überladung bei vielen typecasts Operator Überladungen

void FunctionString(string*); 
void FunctionWrappedString(wrappedString*); 

int main(){ 
    wrappedString wrappedStringObject; 

    FunctionString(&wrappedStringObject); 
    FunctionWrappedString(&wrappedStringObject); 

    wrappedString anotherWrappedStringObject; 

    if(wrappedStringObject == anotherWrappedStringObject){ 
    // code 
    } 
} 

Hier sind die wichtige Teile der Klasse:

class wrappedString{ 
    typedef char* string; 

    string storedString; 

    operator string*(){ 
     // some code 
     return &storedString; 
    } 

    operator wrapperString*(){ 
     // some code 
     return this; 
    } 

    operator string(){ 
    // some code 
    return storedString; 
    } 

}

jedoch nicht diese, wenn ich den Vergleichsoperator verwenden:

if(wrappedStringObject == anotherWrappedStringObject){ 
    // code 
} 

, dass t-sagen Die Kandidaten lauten: operator == (string, string) und operator == (string *, string *)

+1

Einige freundliche Hinweise - zu viele Casting-Operatoren führen zu vielen unvorhergesehenen Problemen, selbst wenn Sie dies erfolgreich kompilieren. Dinge wie Code, die aufgerufen werden, die Sie nicht erwartet haben, sind nur eine davon. Wenn Sie eine 'std :: string' zurückgeben wollen, rufen Sie eine Funktion' get_string' anstatt einer Umwandlung in 'string()' auf. – PaulMcKenzie

+0

@PaulMcKenzie: Oder alternativ den Casting-Operator definieren, aber alle (oder alle bis auf einen oder zwei) Fälle explizit machen (erfordert C++ 11). 'expliziter Operator std :: string *', 'expliziter Operator std :: string' usw. – ShadowRanger

+2

Randnotiz:' typedef char * string; '?!? Warum? Das ist nur eine gute Möglichkeit, den Mist von Benutzern zu verwirren; Ihr 'if (wrappedStringObject == anotherWrappedStringObject)', selbst wenn es funktioniert, testet, dass zwei 'char *' Zeiger auf die gleiche _memory Adresse_ sind, nicht Zeiger auf Zeichenfolgen mit dem gleichen _contents_. – ShadowRanger

Antwort

0

Mehrere implizite Umwandlungsoperatoren verursachen dieses Problem. Wenn das umschlossene Objekt string sich wie ein string verhalten soll (was eigentlich ein char*?!? Ist), dann darf nur ein impliziter Cast-Operator verwendet werden, während der Rest explicit das Risiko eines Fehlverhaltens reduziert. Dies funktioniert nur auf C 11 ++, aber Sie sollten jetzt trotzdem, dass werden:

class wrappedString{ 
    typedef char* string; 

    string storedString; 

    explicit operator string*(){ 
     // some code 
     return &storedString; 
    } 

    explicit operator wrapperString*(){ 
     // some code 
     return this; 
    } 

    operator string(){ 
    // some code 
    return storedString; 
    } 

} 

Mit dieser Definition if(wrappedStringObject == anotherWrappedStringObject){ nur die Überlastung string verwenden, nicht die string* Überlastung.