Q: Pointer Basics



  • Classo* Klasse = new Classo;
    Classo* Super = Klasse;
    

    Wenn ich was an Super änder, änder ich dann auch "Klasse" ?



  • Tim06TR schrieb:

    Classo* Klasse = new Classo;
    Classo* Super = Klasse;
    

    Wenn ich was an Super änder, änder ich dann auch "Klasse" ?

    Um haarspalterisch zu sein, nein. Wenn Du

    Super=0;
    

    oder

    ++Super;
    

    schreibst, hast Du nur super geändert.

    Aber

    (*Super).attrib=5;
    

    bzw

    Super->attrib=5;
    

    ändert sowohl an *Super als auch an *Klasse, denn beide Zeiger zeigen auf ein und das selbe Objekt.





  • Beide Pointer verweisen auf das selbe Objekt auf dem Heap.
    das heißt wenn du du über den Pointer das Objekt änderst,
    hast du die Auswirkungen bei beiden Pointern.



  • Und wie kopier ich die Klasse auf den "Klasse" zeigt und weise diese Kopie "Super" zu. (->elegant)



  • Tim06TR schrieb:

    Und wie kopier ich die Klasse auf den "Klasse" zeigt und weise diese Kopie "Super" zu. (->elegant)

    Classo Super = *Klasse;
    

    oder wenn Du auch unbedingt new verwenden willst.

    edit:

    Classo* Super = new Classo(Klasse);//dies war falsch
    
    Classo* Super = new Classo(*Klasse);//so richtig
    


  • So jetzt warum ich diese Banale Frage gestellt habe (mit dieser Postanzahl ;))

    Das Problem war eben das kopieren, und ich wusste, dass ich nicht einfach die Addresse übergeben darf.
    Mir ist dann auch aufgefallen, wenn ich Clear aufrufe, cleared das beides (unschön).

    Deshalb hab ich nachgehakt. Sonst hätt ich nur rumgewurschtelt.



  • Und noch eine Frage zu dieser Meldung:

    "Klassen mit Eigenschaften dürfen nicht über ihren Wert kopiert werden"

    heißt ?
    besonders: "über ihren Wert" Was ist der "Wert" einer Klasse (hier Array)

    KLASSE Words_Buffer[3];
    
    Words_Buffer[0] = *Words[0];
    

    wie kopier ich den gesamten array, bzw was ist hier noch falsch.
    (zu Words)

    KLASSE* Words[3];
    for (i = 0; i < 3; i++)
    Words[3] = new KLASSE;
    

    und der new konstruktor funzt auch für Arrays (new[])

    [url]http://www.cplusplus.com/reference/std/new/operator new[]/[/url]
    so gefunden, aber wenn ich das unmsetze mach ich watt falsch



  • PhilippM schrieb:

    Pointer basics:
    http://www.youtube.com/watch?v=mnXkiAKbUPg

    Das gibt's aber auch nochmal in der C++ Edition mit new int statt malloc(sizeof(int)) :
    http://www.youtube.com/watch?v=i49_SNt4yfk



  • volkard schrieb:

    Tim06TR schrieb:

    Und wie kopier ich die Klasse auf den "Klasse" zeigt und weise diese Kopie "Super" zu. (->elegant)

    Classo Super = *Klasse;
    

    oder wenn Du auch unbedingt new verwenden willst.

    Classo* Super = new Classo(Klasse);
    

    1. Erste Methode über Variable geht nicht siehe Fehler oben vorletzter Post
    2. Ist nur schlecht wenn der Konstruktor der Klasse einen Parameter hat



  • Tim06TR schrieb:

    volkard schrieb:

    Tim06TR schrieb:

    Und wie kopier ich die Klasse auf den "Klasse" zeigt und weise diese Kopie "Super" zu. (->elegant)

    Classo Super = *Klasse;
    

    oder wenn Du auch unbedingt new verwenden willst.

    Classo* Super = new Classo(Klasse);
    

    1. Erste Methode über Variable geht nicht siehe Fehler oben vorletzter Post

    Verstehe Dein "geht nicht" nicht.

    Tim06TR schrieb:

    2. Ist nur schlecht wenn der Konstruktor der Klasse einen Parameter hat

    😕

    Das müsste übrigends

    Classo* Super = new Classo(*Klasse);
    

    heißen, wenn Klasse ein Zeiger ist.

    siehe
    http://codepad.org/5lYtdCdF



  • Tim06TR schrieb:

    wie kopier ich den gesamten array, bzw was ist hier noch falsch.
    (zu Words)

    KLASSE* Words[3];
    for (i = 0; i < 3; i++)
    Words[3] = new KLASSE;
    

    Du meintest wohl Words[i] statt Words[3] . Abgesehen davon sehe ich da keinen Fehler. Vielleicht gibst Du mal vollständige(!) aber kleine(!) Codebeispiele ohne Abtippfehler(!).

    Tim06TR schrieb:

    und der new konstruktor funzt auch für Arrays (new[])

    😕



  • Ich machs jetzt anders, ohne die gesamte Klasse zu kopieren, sondern nur eine Eigenschaft.

    TStringList* Words_Buffer[3];
    for (i = 0; i < 3; i++)
    {
    	Words_Buffer[i] = new TStringList();
    	for (int j = 0; j < Words[0]->Count; j++)
    	{
    		Words_Buffer[i]->Add(Words[i]->Strings[VecShuffle[j]]);
    	}
    }
    

Anmelden zum Antworten