004
02.09.2011, 14:47 Uhr
0xdeadbeef
Gott (Operator)
|
Das sind dann Stack-Objekte, die müssen nicht von Hand gelöscht werden - sie werden automatisch zerstört, wenn ihr Scope verlassen wird.
Gemeint ist das etwa so:
C++: |
#include "player.h"
#include <cstddef> #include <iostream>
// Bisschen Template-Magie. Gibt die Elementanzahl von Arrays zurück, // lehnt Zeiger ab. template<typename T, std::size_t N> std::size_t array_size(T(&)[N]) { return N; }
int main() { player spieler[] = { player(120), player(120) };
for (int i = 0; i < array_size(spieler); ++i) { std::cout << "Spieler " << i+1 << " hat " << spieler[i].getHealth() << " Lebenspunkte!" << endl; } }
|
Dass du acht Ausgaben für zwei Spieler kriegst, wird (vermute ich) wohl daran liegen, dass du sizeof missverstehst. Hast du in deinem Code
C++: |
for(int i = 0; i < sizeof(spieler); ++i) { // <-- Fehler!
|
stehen? Vermutlich sind ints bei dir 4 Byte breit, und da player nur einen int beinhaltet, wird player auch 4 Byte groß sein. Dann liefert sizeof(spieler) 8 zurück (spieler ist zwei player breit, 2 * 4 = 8), und du interpretierst spieler dementsprechend als Array der Länge 8. Der hinter dem Array liegende Speicher wird dabei schlicht falsch interpretiert, und du kriegst diesen Blödsinn dabei heraus.
Natürlich erzeugt das undefiniertes Verhalten - so was kann locker auch abstürzen oder irgendetwas anderes machen. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 02.09.2011 um 14:52 Uhr von 0xdeadbeef editiert. |