Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

10.05.2008, 13:49

Verständnisfrage

Hi,

hier erst mal ein Listing und dann die Fragen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
using namespace std;

class CRaumschiff
{
private:
    int m_xPos;
    int m_yPos;
    int m_Energie;
    float m_fGeschwindikeit;
public:
    CRaumschiff ();
    CRaumschiff(int xPos, int yPos);
    ~CRaumschiff();
};

CRaumschiff::CRaumschiff ()
{
    cout<<"Parameterloser Konstruktor wurde aufgerufen"<<endl;
    m_xPos=0;
    m_yPos=0;
    m_Energie=1000;
    m_fGeschwindikeit=1.0f;
    cout<<"Schiff wurde erfolgreich erstellt und wurde Inirialisiert"<<endl<<endl;
}

CRaumschiff::CRaumschiff (int xPos, int yPos)
{
    cout<<"Parameter-Konstruktor wurde aufgerufen"<<endl;
    if(xPos >= 0 && xPos <= 800 &&
       yPos >= 0 && yPos <= 600)
    {
        m_xPos = xPos;
        m_yPos = yPos;
    }
    else
    {
        cout << "Fehler, flasche Koordinaten " <<endl;
        m_xPos = 0;
        m_yPos = 0;
    }
    m_Energie=1000;
    m_fGeschwindikeit=1.0f;
    cout<<"Schiff wurde erfolgreich erstellt und wurde Inirialisiert"<<endl<<endl;
}

CRaumschiff::~CRaumschiff ()
{
    cout << "Destruktor wurde aufgerufen " <<endl;
}

int main()
{
    CRaumschiff *pSpieler = NULL;
    CRaumschiff *pGegner = NULL;

    int xEingabe,yEingabe;
    cin>>xEingabe;
    cin>>yEingabe;

    pSpieler = new CRaumschiff[50];                 //NR 1.

    pGegner = new CRaumschiff(100,100);

    delete[] pSpieler;
    pSpieler=NULL;                                          //NR 2.


    delete pGegner;
    pGegner=NULL;

    return 0;
}


So, zuerst zu NR 1.:
WIe bekomme ich das hin, 50 CRaumschiff Instanzen mit einem Parameret Konstruktor aufzurufen. Also ungefähr so:

C-/C++-Quelltext

1
//pSpieler = new CRaumschiff[50](100,100);


NR 2.:

Müsste es nicht *pSpieler = NULL heißen, da man bei der Deklaration ja auch

C-/C++-Quelltext

1
CRaumschiff *pSpieler = NULL


schreibt.

Danke für die Hilfe, will das iwie nicht kapieren =/ .

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

10.05.2008, 13:53

Zu 1:

Du musst Speicher allokieren und die Instanzen über placement new konstruieren.

Zu 2:

Nein, weil du mit *pSpieler den Zeiger dereferenzieren würdest und die Null dem 'gezeigten' Speicher zugewießen würde. Was du aber tun willst ist den Zeiger auf die "Adresse" NULL Zeigen zu lassen, also einen Null-Zeiger aus dem Zeiger zu machen. Daher darf der Zeiger nicht dereferenziert werden und der * fehl am Platz.
@D13_Dreinig

3

10.05.2008, 14:18

Allokieren sagt mir nux.


Achso, das mit den Zeigern habe ich jetzt verstanden =)

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

4

10.05.2008, 14:54

Speicher allokieren und dann per placement new nutzen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
// zusammenhängenden Speicher für 50 Instanzen allokieren

void* mem = new char[ sizeof (CRaumschiff) * 50 ];

// die 50 Instanzen erzeugen

CRaumschiff* ptr = static_cast<CRaumschiff*>(mem);
for (int i=0; i<50; ++i)
{
  // je eine Instanz an vorgegebener Stelle erzeugen

  new (&ptr[i]) CRaumschiff (100, 100);
}


ich bin mir nur grad nich sicher, ob du am Ende die Destruktoren selbst aufrufen musst oder ob es auch legal ist,

C-/C++-Quelltext

1
delete [] ptr
aufzurufen -> also den als char allokierten Speicher als CRaumschiff wieder freizugeben.

5

10.05.2008, 14:55

Warum machst du es dir so unnötig schwer? Nimm doch einfach einen Vector. So hast du mit dem Speichermanagement auch nichts mehr am Hut.

C-/C++-Quelltext

1
2
3
4
5
6
#include <vector>
// ...

std::vector<Raumschiff> spieler;
for(size_t n=0; n<50; ++n) {
    spieler.push_back(Raumschiff(x, y));
}


Grüße... Heiko

6

10.05.2008, 14:55

ach so danke =)

schau mir das jetzt mal genauer an

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

7

10.05.2008, 14:57

Ach ganz einfach:

C-/C++-Quelltext

1
2
3
4
CRaumschiff *pSpieler = new CRaumschiff[50];

// Und wieder löschen

delete[] pSpieler;


Was macht ihr es denn so kompliziert?

Socke

// Edit: Ja vectoren/listen sind die elegante lösung.
Einfach mal bissl weiterlesen oder im internet nach STL Tutorials suchen.

Socke

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

8

10.05.2008, 14:58

jup, in jeder halbwegs normalen Situation is der Vector ratsam :)

würde aber bei 50 Klassenelementen zu einem

C-/C++-Quelltext

1
spieler.reserve(50);

vor der for schleife raten, damit nicht ständig der Speicher komplett umgeschaufelt werden muss ;)


// €dit @ Socke:
Es geht darum, CRaumschiff nicht mit dem Standardkonstruktor zu initialisieren!

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

9

10.05.2008, 14:59

Es gab glaube auch n Konstruktor der das automatisch macht, also 50 elemente erzeugen müsst ich aber nachlesen.

Socke

10

10.05.2008, 15:04

Zitat

"premature optimizing is the source of all evil"


Schon richtig, da hat der Rechner etwas weniger zu tun. Aber selbst wenn er 50 Mal den Speicher umschaufeln müsste, würde er sich sicher schnell langweilen. ;)

Grüße... Heiko
--
Und jetzt ist Sonne angesagt... 8)

Werbeanzeige