Ok Danke, ich hab's glaub jetzt verstanden.
Ein intelligenter Zeiger ist ein Objekt einer Klasse, die sich wie ein Zeiger verhält. Dies wird dadurch erreicht, das die Operatoren *, & , -> sowie die == und != implementiert werden.
Es gibt verschieden intelligenter Zeigertypen, z.B. Zeiger mit Referenzzählung. Gemein haben sie, dass sie RAII ("resource acquisition is initialization"): Ressourcen werden durch durch den Konstruktur in Beschlag genommen und mit dem Destruktor wieder freigelassen. (Als Ressource zählt z.B. ein Zeiger, eine Datei usw.)
Dadurch, dass der Destruktor immer aufgerufen wird (wenn das Objekt den Gültigkeitsbereich verlässt), wird auch jede Ressource freigegeben, Speicherlecks können nicht auftreten.
Der C++ 11 Standard hat intelligente Zeiger einführt, vorher wahr der Einsatz von externen Bibliotheken nötig (z.B. Boost).
Auch vor C++11 gab es schon die auto_ptr. Nur haben die sich nicht immer so verhalten, wie man es erwartet hat.
Aber warum schreibt man überhaupt eine Listenklasse, wenn es doch schon std::list gibt?
Civ4 PBEM: 235, 49, 60, 208, 259, 392 - tot, 22, 71, 90, 340 - vernichtet, 53, 132 - überlebt, 166, 294, 378 - gewonnen
Einfach zum üben/ausprobieren von verschiedenen Konzepten, dachte einfach das ist ein nettes kleines Projekt wo man auch ein bisschen rumspielen kann und recht schnell ein Ergebnis hat. Hab seid Ewigkeiten nichts gescheites mehr programmiert und wollte dann auch gleich c++ lernen/auffrischen/ausprobieren. Gibt ja glaub auch eine vector Klasse wenn ich mich nicht täusche, oder die war glaub für Arrays...
Hmm, hab grad noch mal nee Frage zur Allokation: Und zwar, gibt es irgendwelche "Vorgaben/Richtlinien" wann man welches benutzt? Aktuell hab ich das Gefühl das ich jede Klasse/Objekt dynamisch (über new) reserviere, und nur die Variablen in der Klasse auf den Stack lege wenn sie sowieso nur atomar sind. Hab immer irgendwie die Befürchtung das ich ein erstelltes Objekt nicht dynamisch reserviere und es mir dann überläuft
Und jetzt wollte ich auch grad den Text mit :w speichern
Also bei Java hab ich glaub schonmal nen Stackoverflow geschafft
Naja, das hauptproblem das ich nicht sicher bin wann ich was benutze bleibt bestehen. Meine Level Klasse die ich heute Nacht zusammengehackt habe
class Level{
private:
Level();
public: //public weil zu faul getter und setter zu schreiben
Player* player;
int xSize;
int ySize;
Tile* level;
[...]
}
Player und Tiles werden beide dynamisch allokiert (und im dekonstruktor zerstört). Wenn ich mir sicher bin das die Größe von Player sich nicht weiter ändert, kann ich das glaub auch auf den Stack ablegen oder? Was ist wenn ich Player später noch "Items" (variable Anzahl dieser) unterm Player abspeichern will? Dann muss ich ja Player selber auch wieder dynamsich allokierbar machen damit oder? Alternativ kann man auch wieder zum Listenbsp gehen. Die Elemente könnte ich ja auf den Stack legen (hat nur ein daten Feld und einen Pointer), die Liste selber muss aber dynamisch allokierbar sein weil sie ja eine unbestimmte Anzahl an Elementen haben kann. (Oder, ist glaub egal weil Liste selber nur den Head kennt ) Und wenn ich dann statt einem int zbs ein Array speichern wollte in den ListenElementen müsste ich ja das array dyn alloc und damit auch das ListElem oder ist da wieder
Ich glaub ich hab Gedanklich die von den Pointern reservierten Speicher in die Stelle des Pointers eingefügt was nicht ganz stimmt, die verweisen ja im Grunde nur auf speicher im Heap...
Eidth: Gehe glaub mal langsam schlafen, scheine nicht mehr 100% gerade zu denken
In welcher Zeitzone lebst du?
get und set-Methoden wegzulassen, ist aber wirklich schlechter Stil. Das sollte man nicht mal aus Faulheit machen.
@VK
Ich führe am Samstag und Sonntag ein Effective Java Workshop in Berlin durch. Der heißt zwar Java aber das sind nur Code-Beispiele in Java. Der Inhalt gilt für alle Sprachen... Hast du nicht Lust? (ist auch kostenlos...)
MP live streams | Civ6: Civ 6 - Allgemeines und Civ 6 Strategien-FAQ | PBEM-Tool : PBEM1 - Russland PBC6 - Ägypten+Sumerien PBC18 - Cree PBC19 - Australien
Amateurastronomie Blog
"Eine überragende Kultur kann nicht von außen her erobert werden, so lange sie sich nicht von innen her selbst zerstört hat"
Guten Morgen
Deutschland, warum?
Ich weiß das es furchtbarer Stil ist, aber ich programmiere zur Zeit mit vim und nicht mit einer IDE und das Projekt ist klein genug um den Überblick behalten zu können und ich bin faul und es ist spät .get und set-Methoden wegzulassen, ist aber wirklich schlechter Stil. Das sollte man nicht mal aus Faulheit machen.
Nee, sorry, Berlin ist mir zu weit weg...
Es geht bei Faulheit beim Programmieren nicht nur um Stil, sondern dass irgendwann auch mal wer anderes im Code durchsehen soll. Und wenn da keine vernünftige Struktur drin ist, am Besten noch in Kombination mit unterlassener Kommentierung, sieht da kein Mensch durch. Hatte ich vor kurzem bei einer Homepage'programmierung'. Ich wollte lediglich den Hintergrund von Weiß auf Schwarz ändern (Corporate Design und helle Schrift auf dunklem Grund ist ohnehin viel toller als andersrum). Dafür waren lediglich 5 Variablen zuständig, die natürlich nicht alle background hießen und nicht alle, die background hießen, beschäftigten sich mit dem Hintergrund und kommentiert war gar nichts. Jedenfalls nichts, was nützlich gewesen wäre. Und natürlich waren die Variablen über den ganzen Code verteilt. Ach ja, wunderbare Stunden mit dem Durchprobieren jeder einzelnen Variable mit dem Wert "#fff" und danach den Spaß noch mal mit "#000" (es gibt natürlich auch immer noch mehr als eine Schriftfarbe...) verbracht Ich glaub, wenn ich auf der grünen Wiese angefangen hätte, wär' ich schneller fertig gewesen...
Was lernen wir draus: Gewöhnt es euch gar nicht erst an, faul beim Programmieren zu sein.
Ist mir schon klar, hatte ja selber oft genug mit dem Problem zu kämpfen, aber wie gesagt, das Code snippet war nicht dazu da gelesen zu werden, normal sind die getter und setter immer das erste was ich mache weil es keinen Grund gibt sie nicht zu machen
Zumindest beim Kommentieren bin ich der Meinung das guter Code (so gut wie) keine Kommentare braucht
Hmm, Nebenbei eine Frage: Gibt es eine Möglichkeit eine Variable als nur durch eine Methode ansprechbar zu machen, also auch innerhalb der eigenen Klasse?
Ein Grund sie nicht zu machen ist, wenn sie nur für die Implementierung wichtig sind und nicht für die öffentliche API gebraucht werden.
Für die öffentliche API braucht man Getter und Setter, selbst wenn sie trivial sind, denn man kann nie wissen, ob man später in der Setter doch noch eine Einschränkung des Werts hinzufügen muss. Auf diese Weise bleibt die öffentliche API erhalten.
Nein. Wozu will man auch sowas haben?Hmm, Nebenbei eine Frage: Gibt es eine Möglichkeit eine Variable als nur durch eine Methode ansprechbar zu machen, also auch innerhalb der eigenen Klasse?
Benutze in C++ niemals nackte Zeiger, wenn du es vermeiden kannst! Man spart sich dadurch viel Ärger.
Wenn du verhindern willst, dass deine Objekte auf dem Stack landen, dann schau dir den auto_ptr (obsolete ab C++11) bzw. shared_ptr (neu in C++11) an. Da muss man nur allokieren und ruft das delete nicht selbst auf.
In der Level-Klasse fehlen übrigens noch der Copy-Konstruktor und der Zuweisungsoperator.
Wenn du davon eine Kopie machst, hast du undefiniertes Verhalten, dem du mit dem Debugger tagelang hinterherrennen kannst. Mit shared_ptr würde das auch ohne selbstgeschriebene Copy-Konstruktoren/Zuweisungsoperator funktionieren. Hättest du einen auto_ptr benutzt, würde dein Programm irgendwann wenigstens mit einem NULL-Pointerzugriff abstürzen.
Civ4 PBEM: 235, 49, 60, 208, 259, 392 - tot, 22, 71, 90, 340 - vernichtet, 53, 132 - überlebt, 166, 294, 378 - gewonnen
Was man machen könnte, wenn man denn unbedingt wollte, wäre alle Attribute als privat zu deklarieren und setter und getter zu schreiben und danach eine Unterklasse zu machen, die die eigentliche Arbeit machen soll. Wenn man denn aus irgendwelchen Gründen ein solches Konzept unbedingt bräuchte.