Nachdem meine Vorgänger bereits ausführlich die Syntax erklärt haben,
hier noch eine paar Punkte zum Design.
Mir fallen spontan drei Fälle ein, warum man etwas mit oder ohne Pointer
in einer Klasse speichert.
1) Die Klasse soll Zugriff auf einen externen int haben.
1 | class CSpieler
|
2 | {
|
3 | public:
|
4 | int *ptr;
|
5 | };
|
6 |
|
7 | int main ()
|
8 | {
|
9 | int i = 50;
|
10 | CSpieler Spieler1;
|
11 | *Spieler1.ptr = &i;
|
12 | }
|
1a) Wenn der Zeiger auf den externen Integer sich nie ändert und schon
bei der Konstruktion feststeht, kann du auch eine Referenz nehmen (die
kann dann auch kein null_ptr sein). Allerdings muss man diese im
Konstruktor setzen.
1 | class CSpieler
|
2 | {
|
3 | public:
|
4 | CSpieler(int &x) : n(x) {}
|
5 | int &n;
|
6 | };
|
7 |
|
8 | int main ()
|
9 | {
|
10 | int i = 50;
|
11 | CSpieler Spieler1(i);
|
12 | }
|
2) Die Klasse soll den Integer nur als Parameter haben. In diesem Fall
kannst du den Wert direkt in einen Member kopieren. Vom Speicherplatz
macht es beim int keinen Unterschied zum Pointer, allerdings ist der
Pointerzugriff evtl. langsamer, weil beim Zugriff erst der Pointer aus
der Klasse geladen werden muss und dann anhand dieser Adresse im
Speicher der Wert des int.
3) Die Variante 2 ist nicht gewünscht, weil es statt dem int eine
größere Datenstruktur ist, die nicht auf dem Stack liegen soll. Oder
weil man die Lebenszeit der Struktur unabhängig von CSpieler
kontrollieren möchte.
Ich verwende einen unique_ptr, damit der Speicher in jedem Fall wieder
freigegeben wird. Sonst könnte man vergessen im Destruktor den Speicher
für den int wieder freizugeben.
1 | class CSpieler
|
2 | {
|
3 | public:
|
4 | CSpieler() : ptr(new int) // Speicher für den int anlegen.
|
5 | std::unique_ptr<int> ptr;
|
6 | };
|
7 |
|
8 | int main ()
|
9 | {
|
10 | int i = 50;
|
11 | CSpieler Spieler1;
|
12 | *Spieler1.ptr = &i;
|
13 | }
|