C++ Mehrere Objekte auf eine Klassenvariable zugreifen

Gandalf2210

Commodore
Registriert
Mai 2010
Beiträge
4.167
Hallo zusammen
In der Uni steht mal wieder ein Praktikum an und ich bin mal wieder fleißig am programmieren.
Es gibt hier aber ein kleines Problemchen, wo ich mir nicht zu helfen weiß.

Ich habe eine Klasse Fahrzeug, mit verschiedenen Konstruktoren, Methoden und Eigenschaften.
Wenn ein neues Fahrzeug erzeugt wird, soll ein Zähler hoch gezählt werden, der sagt, wie viele Fahrzeuge es gibt.
Mein Problem ist jetzt, dass jedes Fahrzeug seine EIGENE Zähler Variable hat, da ja alle Eigenschaften und Methoden der Klasse vererbt werden. Sprich wenn ich drei Fahrzeuge erstelle bekommt das vierte Fahrzeug nicht mit, dass vorher schon drei erstellt wurde. Ich suche also eine Art Variable, die in der Klasse steht und auf die ALLE Objekte zugreifen können, und diese auch verändern, in meinem Fall inkrementieren können.
Gibt es da eine Möglichkeit, wie ich dies realisieren könnte? Das der Konstruktor also "weiß" wie viele Objekte schon erzeugt wurden?

mfg Gandalf
 
Hallo, ich werfe einfach nur mal das Stichwort "Klassenvariable" ein. Such mal danach, dann wirst du ziemlich sicher herausfinden, wie das geht.
 
ah ja, das klingt doch schon mal gut, danke euch.
die Variable also in die header Datei schreiben, und dann kann ich extern per Fahrzeug::MaxID drauf zugreifen?
Dafür müsste die dann aber public sein, wenn ich die auch verändern will, oder?

*facepalm* und ich schreibe das Zauberwort auch noch in den Titel...
 
ich würde sie private machen, nur im konstruktor inkrementieren und lediglich eine getter-methode public machen.

die initialisierung von static variablen ist etwas gewöhnungsbedürftig, das solltest du dir auch anschauen.
 
Gandalf2210 schrieb:
ah ja, das klingt doch schon mal gut, danke euch.
die Variable also in die header Datei schreiben, und dann kann ich extern per Fahrzeug::MaxID drauf zugreifen?
Dafür müsste die dann aber public sein, wenn ich die auch verändern will, oder?

Das muß man schon verstanden haben, um es richtig einzusetzen. Arbeite mal bitte das hier sorgfältig durch.
 
ok, also private machen, außerhalb irgendwelcher Funktionen mit 0 Initialisieren und Klassen methoden können dann wie auf eine normale Variable drauf zugreifen?
 
Gandalf2210 schrieb:
ok, also private machen, außerhalb irgendwelcher Funktionen mit 0 Initialisieren und Klassen methoden können dann wie auf eine normale Variable drauf zugreifen?

Genau. Die Initialisierung der statischen Variablen in die zur Klasse gehörigen .cpp-Datei packen. Nicht in den Header! Sonst verletzt du die ODR (One-Definition Rule).

Und nun, da du weißt, wie man statische Daten-Member nutzt, solltest du auch wissen, daß man sie mit Vorsicht genießen sollte, den sie bringen ähnliche Probleme mit sich wie die Benutzung von globalen Variablen. Nur um ein Beispiel zu nennen. Stell dir vor, jemand würde deine Klasse in einem C++-Programm mit mehreren Threads nutzen und erstellt nun in verschiedenen Threads Instanzen deiner Fahrzeug-Klasse. Nun würden also verschiedene Threads ohne jeglichen Schutz an deiner statischen Zählervariable herumfuschen -> das Desaster ist vorprogrammiert. ;)

Man könnte dann natürlich die statische Zählervariable schützen, indem man ihr noch ein statisches Mutex-Objekt zur Seite stellt. Dann müßte eben jeder Zugriff auf die statische Zählervariable vorher immer erst den Mutex in Beschlag nehmen. Ist aber trotzdem unschön.

Für deinen Anwendungsfall ist es also ok; sei aber in Zukunft immer erst mal skeptisch, wenn die Lösung für ein Problem eine statische Variable zu sein scheint. Denke immer erst mal über alternative Ansätze nach.


P.S. Konstante statische Datenmember sind natürlich immer ok.
 
Zuletzt bearbeitet:
Zurück
Oben