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

21.04.2007, 14:57

Problem mit Vererbung

Hallo,

also ich hab wieder mal ein prob mit der vererbung :)

ich möchte gerne eine dynamische größe haben für gegner, also statt nem array CEnemy[50] möcht ich es so haben.

C-/C++-Quelltext

1
*CEnemy = new CEnemy[Größe die ich eben gerade brauche];


das scheint kein problem zu sein und funktioniert auch. jetzt wäre es praktisch, wenn ich natürlich statt der basisklasse CEnemy, noch unterschiedliche gegnertypen zuweisen könnte.

z.b.

C-/C++-Quelltext

1
2
CEnemy[0] = CRat();
CEnemy[1] = CDrake();


usw. auch das funktioniert problemlos, nur funktioniert die methodenüberschreibung nicht :(

also wenn ich dann folgendes ausführe

C-/C++-Quelltext

1
CEnemy[i].Attack();
wird IMMER nur die attackfunktion der basisklasse aufgerufen.
ein weiteres problem ist, dass , wenn z.b. die subclass CRat eine funktion Bite(); besitzt, kann ich diese nicht aufrufen, da es ja keine funktion von CEnemy ist.

jetzt wollt ich fragen, wie man so ein problem am besten lösen könnte. mit nem array ists nicht schwer:D, aber würd teilweise unnötigen speicherplatz verbrauchen und/oder zu wenig platz zur verfügung stellen.

hier mal mein ansatz

C-/C++-Quelltext

1
2
3
4
5
6
7
class CEnemy
{
public:
    // Methods

    CEnemy();
    virtual ~CEnemy(){};
    virtual void Attack();


C-/C++-Quelltext

1
2
3
4
5
6
7
class CRat : public CEnemy
{
public:
    CRat();
    void Attack();
    void Bite();
};


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void createEnemies(CEnemyGroup *Group)
{
    // Create number of enemies

    g_Fighters = new CEnemy[Group->iNumMonsters];
    for(int i=0; i<Group->iNumMonsters; i++)
    {
        switch(Group->iMonsterIDs[i])
        {
        case(10):
            {
                // RAT

                g_Fighters[i] = CRat();                             
            }   break;
        }
        g_Fighters[i].showStats();
    }


bei show Stats zeigt es die werte einer ratte an, somit weiß ich schonmal,dass das funktioniert^^ aber bei attack, wird eben nur die virtual void attack() aufgerufen und bite kann ich sowieso ned aufrufen :)

bitte um hilfe :)

mfg
Simon

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

21.04.2007, 15:06

Entweder du bleibst bei deinem Array aber verwendest zum Initialisieren der Objekte placement new. Oder du verwendest einfach std::vector.

Dann sollte das auch alles funktionieren, sogar mit überladenen Funktionen.

C-/C++-Quelltext

1
2
3
4
5
6
7
std::vector< CEnemy* > v;

v.push_back( new CRat );
v.push_back( new CDrake );

v[ 0 ]->Attack(); 
v[ 1 ]->Attack();


Schlussendlich musst du alle Einträge im vektor wieder freigeben, logisch. Oder du verwendest Smartpointer statt normalen Zeigern.

grüße
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

21.04.2007, 15:06

dein problem ist, dass du ein array aus CEnemy objekten hast...damit sich die sache so verhält wie du es gerne hättest, brauchst du ein array aus zeigern oder referenzen auf CEnemy objekte.

zum thema array beliebiger größe sag ich nur

std::vector, std::list, std::...

4

21.04.2007, 16:27

danke leute :)

mit den vektoren gehts. irgendwie werd ich das prob nie los,dass ich bei vektoren automatisch nur an koordinaten denke und nicht daran, dass die auch was anderes aufnehmen können :)

thx

2 fragen hätt ich etz aber doch noch :)

1.

C-/C++-Quelltext

1
delete g_Fighters[i]; // irgendwann wird die liste leer und dann kommt  g_Fighters.clear();

macht die clear funktion den vekor leer? weil ich verwend die funktion vector.empty() und bau drauf,dass clear dann das erledigt,dass empty() ein true zurückgibt.
das ist nicht so wichtig, das werd ich auch selbst rausfinden ABER

2.

C-/C++-Quelltext

1
char**

ich mach daraus ein 2d array

C-/C++-Quelltext

1
2
3
4
// irgendwo im code

this->cMap = new char*[this->iWidth];
        for(i=0; i<this->iWidth; i++)
            this->cMap[i] = new char[this->iHeight];    

um jetzt die memory leaks zu zerstören genügt es da

C-/C++-Quelltext

1
delete[] cMap;

aufzurufen oder muss ich

C-/C++-Quelltext

1
delete[] *cMap; delete cMap;

aufrufen?

mfg
Simon :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

21.04.2007, 16:30

1. Ja die Methode clear entfernt die Einträge des vectors. Allerdings musst du reservierten Speicher vorher freigeben, wie du ja bereits angedeutet hast.

2. Nein das reicht nicht. Du musst für jeden Eintrag von cMap delete [] aufrufen und dann nochmal für cMap ein delete [].

grüße
@D13_Dreinig

6

21.04.2007, 16:48

C-/C++-Quelltext

1
2
3
4
5
for(int i=0; i<this->iWidth; i++)
        {
            delete cMap[i];
        }
        delete[] cMap;


sry dass ich so lästig bin, aber ist das so richtig?

kann man eignetlich irgendwie nachschauen, wieviel speicherplatz vor dem programm und wieviel danach da war? weil dann könnte ich selbst überprüfen ob memory leaks drin sind oder ned^^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

21.04.2007, 16:53

Zitat von »"Draculark"«

sry dass ich so lästig bin, aber ist das so richtig?


nein

C-/C++-Quelltext

1
2
3
4
for(int i=0; i<this->iWidth; i++)
    delete[] cMap[i];  // [] !!!


delete[] cMap;



Zitat von »"Draculark"«

kann man eignetlich irgendwie nachschauen, wieviel speicherplatz vor dem programm und wieviel danach da war? weil dann könnte ich selbst überprüfen ob memory leaks drin sind oder ned^^


taskmanager :P
naja es gibt auch tools dafür...oder du überlädst dir new und delete etc...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

21.04.2007, 16:55

Statt delete halt ein delete []. Und ja, du kannst das prüfen indem du selbst Buch über Allokationen und Freigaben führst.
Alternativ kannst auch auf darauf http://msdn2.microsoft.com/de-de/library/2f7sy2e9(VS.80).aspx zurückgreifen.
@D13_Dreinig

9

21.04.2007, 17:01

super danke :)

kann es an den leaks liegen, dass manchmal mein visual studio beim kompilieren bzw. debuggen stecken bleibt und ich nicht mal mit dem "ausführen stoppen" oder wie das heißt rückgängig machen kann?
oder liegt das eher daran, dass bei der visual studio installation nicht alles richtig installiert wurde? :P

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

21.04.2007, 17:02

Zitat von »"Draculark"«


kann es an den leaks liegen, dass manchmal mein visual studio beim kompilieren bzw. debuggen stecken bleibt und ich nicht mal mit dem "ausführen stoppen" oder wie das heißt rückgängig machen kann?


Kann sein.
@D13_Dreinig

Werbeanzeige