Probleme mit Templets (Variablenänderung)
-
Hallo,
ich versuche das Arbeiten mit Tampets zu verstehen und habe mir eine Klasse "templet_test" geschrieben, die nur ein Objekt einer Anderen Klasse aufnehmen und wiederhergeben kann.
Die andere Klasse heißt "int_speicher" und kann nur eine int Variable verwalten.
Das Programm:
#include "stdafx.h" #include "iostream.h" class int_speicher { private: int x; public: int_speicher(int y) {x=y;} void setze_wert(int y) {x=y;} void sage() { cout << "Der Wert an dieser Stelle ist: "<<x <<"\n"; } }; template<class T> class templet_test{ private: T *data; public: templet_test(T*); T get(void); void set(T*); }; template <class T> templet_test<T>::templet_test(T *t1) { data = t1; } template <class T>T templet_test<T>::get(void) { return *data; } template <class T>void templet_test<T>::set(T *t1) { data=t1; } int main(int argc, char* argv[]) { int_speicher* k = new int_speicher(2); k->sage(); templet_test<int_speicher> l(k); l.get().setze_wert(10); l.get().sage(); k->sage(); return 0; }Das Programm lässt sich übersetzen und gibt folgendes aus:
Der Wert an dieser Stelle ist: 2
Der Wert an dieser Stelle ist: 2
Der Wert an dieser Stelle ist: 2
Press any key to continueWarum wird die Änderung, die ich in der Zeile
l.get().setze_wert(10);
vornehme nicht aktiv.Ich erzeuge zunächst ein Objekt "k" der Klasse "int_speicher" mit dem Wert 2
Dann lasse ich der Wert ausgeben. Es wird 2 ausgegeben.Nun erzeuge ich ein Objekt l der Klasse "templet_test" und übergebe im Konstruktor einen Zeiger auf das eben erzeugte Objekt "k" der Klasse "int_speicher".
Nun lasse ich mir der gespeicherten zeiger geben und versuche änderungen an dem Objekt "k" der Klasse "int_speicher" vorzunehmen. Dies versuche ich mit call by vallue.
Ich habe mir gedacht, dass der Wert ja nach der änderung ruhig gelöscht werden kann, da die Änderung ja vollzogen sein müsste. aber das funktioniert nicht!Was habe ich falsch gemacht?
-
Hallo, weil T get() eine Kopie von T und keine Referenz zurückgibt.
-
Danke, jetzt habe ich es hinbekommen. Ich habe den Fehlewr immer bei set gesucht

-
Hallo, ich habe noch eine Frage dazu:
Ist dort eine Kopie des ganzen Objektes zurückgegeben worden mit get()?
Wie geht das, ich habe doch gar nicht sowas wie eine Clone Methode geschrieben?
-
Anfänger 01 schrieb:
Hallo, ich habe noch eine Frage dazu:
Ist dort eine Kopie des ganzen Objektes zurückgegeben worden mit get()?
In deinem Original-Code ja... (Woraus auch dein Ausgangsfehler resultiert, da du die Kopie, die von l.get() zurückgegeben wird, veränderst jedoch gleich danach wieder verwirfst => Non-Sense)
Wie geht das, ich habe doch gar nicht sowas wie eine Clone Methode geschrieben?
Die "Klon"-Methode wird Copy-Ctor genannt. Wenn du keinen eigenen Copy-Ctor definierst wird ein Standard-Copy-Ctor vom Compiler definiert, der für jedes Datenelement der Klasse den Copy-Ctor aufruft. (Bei PODs wird eine bitweise Kopie erzeugt).
Caipi
-
Hallo,
wie muß ich denn genau die Methodendeklaration eines Copy-Ctor deklarieren, wenn ich einen eigenen schreiben will?
-
steht so ziemlich in jedem tutorial --> oben rechts
bsp: http://tutorial.schornboeck.net/bigthree.htm
-
Anfänger 01 schrieb:
Hallo,
ich versuche das Arbeiten mit Tampets zu verstehen und habe mir eine Klasse "templet_test" geschrieben, die nur ein Objekt einer Anderen Klasse aufnehmen und wiederhergeben kann.
Die Dinger heißen übrigens "Templates" (engl.: Schablonen) 