Seite 1 von 1
					
				Const Correctness und operator[]
				Verfasst: Fr Apr 26, 2013 10:52 am
				von Glocke
				Hi, folgendes Beispiel:
Code: Alles auswählen
#include <iostream>
class Test {
    public:
        std::string& operator[](std::string const & key) {
            // irgendwas
            std::string* s = new std::string(key);
            return *s;
        }
};
int main() {
    Test const t;
    std::string value = t["Hallo Welt"];
    std::cout << value << std::endl;
}
Leider kann ich mit der Compiler-Meldung
Fehler: Die Übergabe von »const Test« als »this«-Argument von »std::string& Test::operator[](const string&)« streicht Qualifizierer [-fpermissive]
nicht umgehen. Btw zeigt sie genau auf die Zeile 
Kann mir jemand sagen was ich falsch mache? t soll zwingend 
Test const sein.
LG Glocke
/EDIT: Muss ich dann neben 
 auch noch 
Code: Alles auswählen
const T_return& X::operator[](T_index const& index) const;
 implementieren, da mein Container (also mein t) konstant ist?
 
			
					
				Re: Const Correctness und operator[]
				Verfasst: Fr Apr 26, 2013 11:06 am
				von Xin
				Glocke hat geschrieben:Hi, folgendes Beispiel:
Code: Alles auswählen
#include <iostream>
class Test {
    public:
        std::string& operator[](std::string const & key) {
            // irgendwas
            std::string* s = new std::string(key);
            return *s;
        }
};
 
Seeekunde... wenn Du ein neues Objekt anlegst, dann kostet das - egal ob Du es auf dem Stack oder im Freispeicher anlegst.
Ein Objekt, das Du mit new anlegst, musst Du auch wieder entsorgen! Also bleib mal beim Stack.
Code: Alles auswählen
#include <iostream>
class Test {
    public:
        std::string& operator[](std::string const & key) {
            // irgendwas
            return std::string( value );
        }
};
Glocke hat geschrieben:
Leider kann ich mit der Compiler-Meldung
Fehler: Die Übergabe von »const Test« als »this«-Argument von »std::string& Test::operator[](const string&)« streicht Qualifizierer [-fpermissive]
nicht umgehen. Btw zeigt sie genau auf die Zeile 
Kann mir jemand sagen was ich falsch mache? t soll zwingend 
Test const sein.
/EDIT: Muss ich dann neben 
 auch noch 
Code: Alles auswählen
const T_return& X::operator[](T_index const& index) const;
 implementieren, da mein Container (also mein t) konstant ist?
 
Du kannst auch ausschließlich nur die Const-Variante implementieren. Dann darfst Du aber halt keine (nicht-const) Referenzen in das Objekt zurückgeben. Da Du in dem Fall hier aber sowieso eine Kopie anlegst, passt das.
 
			
					
				Re: Const Correctness und operator[]
				Verfasst: Fr Apr 26, 2013 11:17 am
				von Glocke
				Xin hat geschrieben:Seeekunde... wenn Du ein neues Objekt anlegst, dann kostet das - egal ob Du es auf dem Stack oder im Freispeicher anlegst.
Ein Objekt, das Du mit new anlegst, musst Du auch wieder entsorgen! Also bleib mal beim Stack.
Code: Alles auswählen
#include <iostream>
class Test {
    public:
        std::string& operator[](std::string const & key) {
            // irgendwas
            return std::string( value );
        }
};
 
Das wollte ich eigentlich auch machen, nur mecker er da:
Code: Alles auswählen
Fehler: ungültige Initialisierung einer nicht-konstanten Referenz des Typs »std::string& {aka std::basic_string<char>&}« von R-Wert des Typs »std::string {aka std::basic_string<char>}«
Xin hat geschrieben:Du kannst auch ausschließlich nur die Const-Variante implementieren. Dann darfst Du aber halt keine (nicht-const) Referenzen in das Objekt zurückgeben. Da Du in dem Fall hier aber sowieso eine Kopie anlegst, passt das.
Okay, danke 

 Bleibt nur noch das Problem von oben 

 
			
					
				Re: Const Correctness und operator[]
				Verfasst: Fr Apr 26, 2013 12:02 pm
				von Xin
				Glocke hat geschrieben:Okay, danke 

 Bleibt nur noch das Problem von oben 

 
 
 Das & muss dann natürlich auch weg, weil Du ja die neue Instanz rüberreichst:
Code: Alles auswählen
        std::string /* & */ operator[](std::string const & key) {