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 *)
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
@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
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