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


Log in to reply