Kopierkonstrukter auf Adresse des neuen Objektes



  • @Simon2

    Der Code ist wohl eher der Rohbau (die Vorgabe) der Aufgabe. 😉
    Hui99 hat vermutlich noch nichts geändert.



  • Ich bin gerade die ganze zeit am suchen. Ich bekomme das aber mir diesem Kopierkonstruktor in den Kopf.

    Was ich bis jetzt habe ist:

    Test(Test & const kette) {	
    string = new str;
    str = kette.getString();
    }
    

    und natürlich das was ganz oben steht.

    Aber da bekomme ich gut viele fehler vor allem
    error C2143: Syntaxfehler : Fehlendes ';' vor '}'

    aber mir wird nicht ersichtlich wo



  • Test(Test & const kette)
    

    Das kann gar nicht gut gehen (eine Referenz ist immer konstant). Schreib eines der folgenden Dinge:

    Test(const Test& kette)
    Test(Test const& kette)
    
    string = new str;
    str = kette.getString();
    

    Hier wieder: Ist str nun ein Typ oder ein Member? Man versteht nicht, was du machen willst. Ausserdem kann man im Konstruktor Initialisierungslisten verwenden. Und vergiss nicht, einen entsprechenden Destruktor und Zuweisungsoperator selber zu implementieren, sonst hast du relativ schnell Probleme mit den Zeigern...

    Aber da bekomme ich gut viele fehler vor allem
    error C2143: Syntaxfehler : Fehlendes ';' vor '}'

    Die Häufigkeit der Fehler ist meistens nicht relevant, da aus einem viele andere resultieren können. Schau dir am besten immer den ersten Fehler an.



  • So jetzt ein neuer versuch ^^

    Hier mal das was ich habe:

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    class Test {
    
    private:
    	char str;
    	char * pStr;
    
    public:
    	Test (char);
    	char getString() {
    		return str;
    	}
    
    Test(Test &const);
    
    void datenAus();
    
    };
    
    Test::Test(char iWert): str(iWert), pStr(&str){
    
    }
    
    /*Hier bekomme ich einen fehler mit dem ich aber nicht anfangen kann: 
    error C2351: Veraltete Syntax fuer die Initialisierung eines C++-Konstruktors
    */
    Test::Test(Test & objekt):(objekt.str), pStr(&str){
    }
    
    void Test::datenAus() {
    	cout <<"str = " << str << ", pStr = " << pStr << endl;
    }
    
    int main() {
    
    	return 0;
    }
    

    Macht das Porgamm jetzt eigentlich das was die aufgabe von mir will?

    Hier nochmal die Aufgabestellung?
    Schreiben Sie einen Kopierkonstruktor, der die Zeichenkette des zu kopierenden Objektes übernimmt, aber nicht seine Adresse, sondern die Adresse des neuen Strings in dem neuen Objekt ablegt.



  • Ahh ok habe den fehler gefunden. Hat ein "str" von der Klammer gefehlt ^^

    Jetzt bleibt nur noch die frage ob die aufgabe richtig gelöst ist ^^



  • Gab es denn ein Vorgabe für die Aufgabe? Im Aufgabentext lese ich etwas von ZEICHENKETTE und STRING. Du hast jetzt ein Zeichen (nur ein char) implementiert.

    Ansonsten bist du auf dem richtigen Weg.



  • Also die vorgabe stand ganz oben. Das ist was vorgeben war. Aber alle beispiele sind immer nur mit int oder char. Deswegen habe ich es erstmal so porbiert um es ertsmal zum laufen zu bekomme. Jetzt muss ich nur noch alles in string umwandeln. ^^



  • höhöhö es läuft ^^

    Jetzt die Aufgabe richtig gelöst?

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    class Test {
    
    private:
    	string str;
    	string * pStr;
    
    public:
    	Test (string);
    	string getString() {
    		return str;
    	}
    
    Test(Test &const);
    
    void datenAus();
    
    };
    
    Test::Test(string iWert): str(iWert), pStr(&str){
    
    }
    
    Test::Test(Test & objekt):str(objekt.str), pStr(&str){
    }
    
    void Test::datenAus() {
    	cout <<"str = " << str << ", pStr = " << pStr << endl;
    }
    
    int main() {
    
    Test k21("Hallo");
    Test k22(k21);
    k21.datenAus();
    k22.datenAus();	
    	return 0;
    }
    


  • Nah dran!

    Du hast den Tipp von Nexus nicht beachtet.

    Sowohl innerhalb der Klassendefinition als auch in der Definition des Copy-Konstruktors ist der const-Qualifier nicht ganz korrekt angewendet.

    Ansonsten ist das OK. Hat sich doch gelohnt es selbst zu versuchen, was?



  • Hallo,

    wie kann es sein das dein Beispiel läuft 😕

    Naja, egal. Für mich stellen sich hier ein paar Fragen. Die erste ist wohl, ob du den Unterschied zwischen char, char*, char[], string und string* kennst 😃

    Test(Test &const);
    

    @kritiker: Wieso speichert er eigentlich den Zeiger und den Typ ab?



  • Mir macht das ja spaß hätte nur nmicht gedacht das ich es in der Zeit schaffe. Das mit dem const habe ich eh noch nicht so ganz verstande. Naja dann mal weiter zur nächsten aufgabe 😃



  • hui99 schrieb:

    Das mit dem const habe ich eh noch nicht so ganz verstande. Naja dann mal weiter zur nächsten aufgabe

    Mal sehen, wie weit du mit der Einstellung kommst, bzw. wie oft du den gleichen Fehler noch machen wirst... 🙄

    Wenn es ein gutes Buch ist, sollte es schon erklärt haben, was es mit dem const auf sich hat. Und ansonsten hindert dich niemand daran, weitere Recherchen anzustellen. Zumindest hat es keinen Wert, eine Klasse zu schreiben, von der man über die Hälfte nicht versteht (wie Siassei sagte, auch die Typen solltest du noch einmal genauer anschauen)...



  • Ahhh ok ich glaube jetzt habe ich es mit dem const, naja mein super neuste compiler version (Visual c++ 6.0) gibt mir keine fehler aus. Davor gab es immer eine warnung: "Anachronismus verwendet: Qualifizierer auf Verweise werden ignoriert"

    Aber die ist jetzt auch behoben.

    Hier noch mal der Quellcode. Hoffe jetzt ist wirklcih alles richtig.

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    class Test {
    
    private:
    	string str;
    	string * pStr;
    
    public:
    	Test (string);
    	string getString() {
    		return str;
    	}
    
    Test(const Test& objekt);
    
    void datenAus();
    
    };
    
    Test::Test(string iWert): str(iWert), pStr(&str){
    
    }
    
    Test::Test(const Test & objekt):str(objekt.str), pStr(&str){
    }
    
    void Test::datenAus() {
    	cout <<"str = " << str << ", pStr = " << pStr << endl;
    }
    
    int main() {
    
    Test k21("Hallo");
    Test k22(k21);
    k21.datenAus();
    k22.datenAus();	
    	return 0;
    }
    


  • @Hui99
    👍 Jetzt hast du es. Und nicht auf den Compiler schimpfen, der hat dich ja darauf hingewiesen. VC9 hätte dir identisch geantwortet. 🙂
    Vielleicht würde noch etwas "Ordung" im Quelltext guttun.

    @Siassei
    Wus? Wo?


Anmelden zum Antworten