funktioniert nicht
-
Also erstmal sorry, ich muss leider den ganzen Code posten,
weil ich keine ahnung habe, woran es liegen könnte.
Beim Kompilieren bekomme ich nen Batzen an Fehlermeldungen:warning 104 C4018: '<': Konflikt zwischen 'signed' und 'unsigned'
error 136 C2666: 'operator ==': 2 Überladungen haben ähnliche Konvertierungen
(84): kann 'bool operator ==(const char *,const String)' sein [bei der Verwendung der argumentbezogenen Suche gefunden]
1> oder "integrierter C++-Operator==(char *, char *)"
1> bei Anpassung der Argumentliste '(char [30], String)'#include <iostream> using namespace std; class Complex { private: double _real; double _image; public: Complex operator-() { return Complex( -_real, -_image ); } Complex( double val1 = 0.0, double val2 = 0.0 ) { _real = val1; _image = val2; } void print_Complex() { cout << _real << "+" << _image << endl; } friend Complex operator+( Complex v1, Complex v2 ); Complex operator-( Complex val2 ) const { Complex tmp(*this); tmp._real -= val2._real; tmp._image -= val2._image; return tmp; } friend Complex operator+( double val1, Complex val2 ); Complex& operator++() { _real++; _image++; cout << "Präfix ausgewählt " << endl; return *this; } Complex& operator++(int) { static Complex tmp(*this); _real++; _image++; cout << "Postfix ausgewählt " << endl; return tmp; } friend ostream &operator<<( ostream& os, const Complex &val ); friend istream &operator>>( istream& is, Complex &val ); }; class String { private: char *buffer; unsigned int len; public: // Kontruktor String ( const char* s = "" ) { len = strlen(s); buffer = new char [len+1]; strcpy( buffer, s ); } // Destruktor ~String() { delete [] buffer; } // Kopierkonstruktor - nötig wegen dynamisch String( const String &s ) { len = s.len; buffer = new char [len+1]; strcpy( buffer, s.buffer ); } // Zugriffmethode char *get_String() const { return buffer; } String operator+=( const String & str1 ) { String tmp(*this); delete [] buffer; len = tmp.len + str1.len; buffer = new char[len+1]; strcpy( buffer, tmp.buffer ); strcat( buffer, str1.buffer ); return buffer; } friend bool operator== ( const char *s1, const String s2 ); friend bool operator! ( const String s ); String& operator =( const String &s ) { if ( this == &s ) return *this; delete [] buffer; buffer = 0; len = s.len; buffer = new char[len+1]; strcpy( buffer, s.buffer); return *this; } const char& operator[] (int index) const { return buffer[index]; } char* operator[](const char* str ) const { return strstr( buffer, str ); } const String operator()(int pos, int count ) const { if( ( pos >= 0) && (count < len ) ) { String tmp(*this); char *ptr = tmp.buffer + pos; ptr[count] = '\0'; return String(ptr); } return String( buffer ); } const long operator()(int base) const { if( (base==16) || (base == 10) || (base == 8) ) { unsigned long zahl = strtol(buffer, 0, base); return zahl; } return 0; } operator char*() const { return buffer; } }; Complex operator+( double val1, Complex val2 ); bool operator! ( const String s ); int main() { String s1("Adam"); char name[30]; cout << "Bitte Namen eingeben " << endl; cin >> name; if( name == s1 ) cout << "Beide Namen sind identisch" << endl; else cout << "Beide Namen sind unterschiedlich" << endl; if( s1 == name ) // Geht nur, weil ich es extra gemacht habe. cout << "Beide Namen sind identisch" << endl; else cout << "Beide Namen sind unterschiedlich" << endl; Complex val1( 1.1, 2.2 ); Complex sum; sum = 3.3 + val1; cout << "Wert von sum " << endl; sum.print_Complex(); sum = -val1; cout << "Wert von sum " << endl; sum.print_Complex(); String s2("LOL"); if(!s2) cout << "S2 ist leer" << endl; else cout << "S2 ist nicht leer" << endl; Complex val2( 1.1, 2.2 ); ++val1; val1++; String s3 = "Hallo"; String s4 = s3; cout << s4.get_String() << endl; String s5 = "Adam"; cout << s5[0] << s5[2] << endl; String ss1 = "Gockel und Henne"; char *ptr = ss1["und"]; cout << ptr << endl; ptr = ss1["He"]; cout << ptr << endl; Complex val11; cin >> val11; cout << val11; String sss1 = "Adam und Eva"; String sss2 = string1(5,3); String sss3 = string1(9,3); cout << sss1 << endl; cout << sss2 << endl; cout << sss3 << endl; String zahl = "100"; long val = 12345, gesamt; gesamt = val + zahl(10) cout << gesamt << endl; cout << zahl(16) << endl; cout << zahl(8) << endl; system("PAUSE"); return 0; } Complex operator+( Complex val1, Complex val2 ) { Complex tmp; tmp._real = val2._real + val1._real; tmp._image = val2._image + val1._image; return tmp; } bool operator == ( const char *s1, const String s2 ) { if( strlen(s1) == 0 || s2.len == 0 ) { cout << "Einer der Strings ist leer!" << endl; return 0; // False } if( strcmp(s1, s2.buffer ) == 0 ) { return 1; // True } return false; } Complex operator+( double val1, Complex val2 ) { Complex tmp; tmp._real = val1 + val2._real; tmp._image = val2._image; return tmp; } bool operator! ( const String s ) { if( strcmp( s.buffer, "") == 0 ) return 1; return 0; } ostream &operator<<( ostream& os, const Complex &val ) { os << val._real << "+" << val._image << endl; return os; } istream &operator>>( istream& is, Complex &val ) { cout << "Real-Teil : "; is >> val._real; cout << "Imaginärer Teil: "; is >> val._image; return is; }
-
operatorÜ schrieb:
...
error 136 C2666: 'operator ==': 2 Überladungen haben ähnliche Konvertierungen
(84): kann 'bool operator ==(const char *,const String)' sein [bei der Verwendung der argumentbezogenen Suche gefunden]
1> oder "integrierter C++-Operator==(char *, char *)"
1> bei Anpassung der Argumentliste '(char [30], String)'
...Äh .... da steht doch schon alles.
(Es hätte also nur "operator == ( const char *s1, const String s2 )" gebraucht)
Gruß,
Simon2.
P.S.: Was für ein Compiler wirft eigentlich so schöne Fehlermeldungen raus ?
P.P.S.: Ändere doch mal den Threadtitel.
-
wie das verstehe ich nicht.
Eigentlich muss es was mit dem überladen dieser () operatoren zu tun haben,
weil ich es davor kompilieren konnte.
Das ist Visual C++ von der besten Firma der Welt
-
Naja,
da Du dem Compiler nun erlaubt hast,
- überall, wo char* steht auch ein String-Objekt zu nehmen (durch den entsprechenden Konstruktor)
- ... UND ...
- überall, wo String steht auch ein char* zu nehmen (durch den entsprechenden cast-Operator),
... kommt er natürlich ins Schwitzen, welche Typen er denn nun bei
... if( name == s1 ) ...
nehmen soll.
Er hat nämlich die beiden zur Auswahl:1> oder "integrierter C++-Operator==(char *, char *)"
1> bei Anpassung der Argumentliste '(char [30], String)'und sie sind beide "gleichwertig":
error 136 C2666: 'operator ==': 2 Überladungen haben ähnliche Konvertierungen
(84): kann 'bool operator ==(const char *,const String)' sein [bei der Verwendung der argumentbezogenen Suche gefunden]Es ist übrigens eines der guten Design-Entscheidungen bei std::string gewesen, keinen char*-Cast-Operator anzubieten....
Gruß,
Simon2.
P.S.: OK, der operator==() hätte nicht ganz gereicht, aber ohne "Complex" hättest Du den Fehler auch reproduzieren können. Und das will ich Dir als Tipp für die zukünftige Fehlersuche mitgeben: Durch gezieltes "Codelöschen" erstmal die Stellen raussuchen, die wirklich entscheidend sind für den Fehler.
-
ok dannke und wie behebe ich das jetzt genau^^
-
operatorÜ schrieb:
ok dannke und wie behebe ich das jetzt genau^^
std::string verwenden.
:p
Wenn Du das nicht willst, kannst Du den String::String(char const*); als "explicit" deklarieren. Dann kommt er für eine automatische Konvertierung nicht mehr in Frage.
... allerdings halte ich es trotzdem für eine bessere Idee, auf den cast-Operator zu verzichten: Der wird Dir noch einigen Ärger bereiten (z.B. wenn Du den interenen Buffer vergrößern (= verschieben) möchtest, aber irgendein Aufrufer noch einen Zeiger auf den alten in den Händen hält).
.... bzw. eben std::string nehmen.
Gruß,
Simon2.
-
ok danke