Frage zu OperatorÜberladung []



  • wieso stürzt mein Programm ab ?

    #include <iostream>
    
    class test {
    
    public:
    
    	test(){x="String";}
    
    		char& operator[](int i)
    	{
             return(x[i]);
    
    	}
    private:
    
     char* x;
    
    };
    
    void main(void)
    {
    
    test objekt;
    
    objekt[2] = 't';
    
    std::cout<<objekt[2];
    
    }
    


  • Weil du Stringliterale nicht beschreiben darfst. Deklariere x als std::string und das Problem ist vom Tisch.



  • Weil das String-Literal "String" im schreibgeschützten Teil der exe-Datei liegt.



  • häh warum darf ich keine C string beschreiben ?

    und was wird hier im Fehlerfall zurückgeliert ?

    double& Vector::operator[](int i)
     {
       if (i<0 || i>=len) error(err_index);
       return v[i];
     }
    


  • blurry333 schrieb:

    häh warum darf ich keine C string beschreiben ?

    Keine Stringliterale. Weil das der Standard nun mal vorschreibt, um dem Compiler mehr Möglichkeiten, beispielsweise zur Optimierung, zu lassen.

    Dass man andere Literale nicht ändern kann, stört ja auch niemanden. Oder wer käme auf die Idee, 3 = 5; zu schreiben?

    blurry333 schrieb:

    und was wird hier im Fehlerfall zurückgeliert ?

    Nichts. Verwende in so einem Fall assert .



  • blurry333 schrieb:

    ...

    Davon abgesehen ist deine Einrückung grausig (wie auch immer du Einrückst: bleibe einheitlich), ich habe mal eine kleine Ausbesserung inklusive kleinen Anmerkungen hinzugefügt:

    #include <iostream>
    #include <string>
    
    class test
    {
      public:
        test()
        :   x("String") // Initialisierungsliste ist der nachträglichen
        {               // Zuweisung vorzuziehen.
        }
    
        char & operator[](int i)
        {
            return(x[i]);
        }
    
      private:
        std::string x;
    };
    
    int main() // Es gibt kein "void main", und das "(void)" kann man sich sparen,
    {          //   dies ist ein C-Relikt. Unter C++ ist "()" weitaus üblicher.
        test objekt;
        objekt[2] = 't';
    
        std::cout << objekt[2];
    
        // int main() gibt als Ausnahme zu anderen Funktionen mit Rückgabewert
        // implizit 0 zurück, wenn nichts anderes angegeben wird. Daher ist hier
        // ein return 0; unnötig.
    }
    


  • Und nicht zu vergessen ein:

    return 0;
    


  • Zeus schrieb:

    Und nicht zu vergessen ein:

    return 0;
    

    Nein, siehe noch meinen hinzugefügten Kommentat.



  • "string" bedeutet wohl so etwas wie konstanter String.

    Wundert mich nur dass der Compiler keinen Fehler erklärt.
    Dies macht erst der linker bei der Programmausführung.



  • das geht auch nicht

    class test { 
    
    public: 
    
    	test(){x="String";} 
    
            char& operator[](int i) 
        { 
             return(x[i]); 
    
        } 
    private: 
    
     string x; 
    
    };
    

    wußt ich ja gar nicht.

    #include <string>

    ist unnötig 🙂



  • Aufmerksam asc post lesen.



  • ok schon klar die klasse string liegt im namespace std ;

    ok das wär geklärt



  • blurry333 schrieb:

    ok schon klar die klasse string liegt im namespace std ;

    ok das wär geklärt

    Und <string> ist nötig, vielleicht Ausnahmsweise nicht auch deiner jetzigen Umgebung [Da es sein könnte das iostreams in der bei dir vorliegenden Bibliothek sting inkludiert], aber das ist nicht der Standard.

    blurry333 schrieb:

    "string" bedeutet wohl so etwas wie konstanter String.

    Eben nicht. Im Gegensatz zu den klassischen C-Strings (char[], char*) handelt es sich hier um eine vollwertige Stringklasse, die sich auch um die Speicherverwaltung kümmert. So ist es z.B. möglich string "aufzuaddieren" usw.

    // Sieht nicht wirklich konstant aus, oder?
    std::string x = "Hallo";
    x += " Welt";
    std::cout << x;
    

    Des weiteren liefert die Stringklasse diverse Stringbehandlungen als Methode von Haus aus mit.


Log in to reply