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

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

21

12.07.2006, 16:22

C-/C++-Quelltext

1
2
3
4
5
6
// Beides sind dynamische Container

std::list<Base*> liste;
std::vector<Base*> array;

// Das ist (ohne extra Programmierung) kein dynamischer Container

Base** field = new (Base*) [anzahl];


Die std::Container sind einfacher, weil man sich da um Vergrößern/Verkleinern keine Gedanken machen muss. Jedenfalls, wenn du C++ programmierst.

Ich meinte ausserdem nur, dass du kein zweidimensionales Feld hast. Base** bedeutet nicht automatisch "zweidimensional."

Das Base hier abstrakt ist, macht gar keinen Unterschied. Alle drei Varianten speichern ja nur Zeiger darauf.

MfG,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Chase

Alter Hase

  • »Chase« ist der Autor dieses Themas

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

22

12.07.2006, 17:39

Zitat von »"rklaffehn"«

C-/C++-Quelltext

1
2
3
// Beides sind dynamische Container

std::list<Base*> liste;
std::vector<Base*> array;

Tja gegen Container hab ich in diesem Fall auch was einzuwenden:
So wie das jetzt geschrieben ist kann ich 'liste' schlecht kopieren: Die Zeiger werden zwar alle kopiert, zeigen jedoch immernoch auf die selben Objekte.

Ich hab mich nur gefragt ob es eine einfachere Methode gibt. Das ist jedenfalls mein Code zur Vergroesserung, damit wird das ganze doch dynamisch oder?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
//Create a new double-sized pointerfield and initialize it to NULL

Entity** newField = new Entity*[m_iEntities*2];
for(int i = 0;i<m_iEntities*2;++i) newField[i] = NULL;
//Copy the old pointers

for(int i = 0;i<m_iEntities;++i) newField[i] = m_entities[i];
//delete the old pointers but don't delete the objects they point to!

delete[] m_entities;
//Update the pointer and double the number of elements

m_entities = newField;
m_iEntities *= 2;
//now we have more space, try again


Ich schliess gleich mal ne Frage an:
Kann ich in einer erbenden Klasse irgendwie den Konstruktor/Destruktor der Parent-Klasse aufrufen oder sollte man in C++ den shared-code besser in Funktionen à la Init() und Release() unterbringen?
"Have you tried turning it off and on again?"

23

12.07.2006, 17:43

in der initialisierungsliste des constructors...
myClass::myClass(....) : base()
{

}

Chase

Alter Hase

  • »Chase« ist der Autor dieses Themas

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

24

12.07.2006, 17:49

Und was passiert wenn ich eine Methode einfach explizit aufrufe?

C-/C++-Quelltext

1
2
3
4
Derived::~Derived(void)
{
  Base::~Base();
}

kann ich jedenfalls kompilieren..
"Have you tried turning it off and on again?"

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

25

12.07.2006, 17:54

Ein Destruktor ruft auch immer die Destruktoren der Basisklassen auf. Das was du machst ist also unnötig.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Chase

Alter Hase

  • »Chase« ist der Autor dieses Themas

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

26

12.07.2006, 19:47

Ah ok :)
Dann eine Nummer schwerer: Der Konstruktor der Basisklasse soll eine virtuelle Memberfunktion aufrufen, die natuerlich die entsprechene Fkt. der Subklasse sein soll. Geht das irgendwie?
Noch etwas Code zur Verdeutlichung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class foo
{
  foo(void)
 {
   sprich();
 }
  virtual void sprich(void){out("foo!");}
};

class bar : public foo
{
    void sprich(void){out("bar!");}
};

Wenn man ein Objekt bar erzeugt, wird der Ctor von foo aufgerufen. Jetzt ist die Frage ob der Konstruktor ueberhaupt erkennt welche Klasse ihn aufgerufen hat, da die Polymorphie so nicht funktioniert..
"Have you tried turning it off and on again?"

27

12.07.2006, 21:35

nein, das dürfte so nich funktionieren, da der base-konstruktor nix von der _vftable weiß (oder?)

eventuell funktionpointer oä verwende

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

28

12.07.2006, 21:43

Aber Hallo warum sollte das nicht funktionieren? Zumindest kann die Basisklasse die überladenen Funktionen aufrufen.

Ob jedoch schon der Basiskonstruktor korrekt auf die überladenen Funktionen zugreifen kann, weiß ich nicht.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

29

12.07.2006, 23:04

Zitat von »"Nox"«

Aber Hallo warum sollte das nicht funktionieren?


Zitat von »"Nox"«

Ob jedoch schon der Basiskonstruktor korrekt auf die überladenen Funktionen zugreifen kann, weiß ich nicht.


na was nu? :)

nebenbei: hab s einfach mal ausprobiert und wie erwartet, ruft er nich die überladene funktion sondern die funktion aus base auf

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

30

12.07.2006, 23:45

Ich habe habe gleichzeitig 2 Einschränkungen, die für deine Testreihe entscheidend sein drüfte - Stichwort inline ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige