PDA

View Full Version : [C++] Collections


zarko
24-05-2009, 19:44
Ciao a tutti,
conosco le Collections di C#, adesso devo utilizzarle in un progetto C++. c'è qualcosa di simile? ho trovato le list ma non mi aiutano molto...
In sostanza voglio creare qualcosa di simil al loop di gioco di XNA (per chi lo conosce creo diverse classi tutte derivate dalla stessa, vengono istanziate e memorizzate in una collection e il loop di base richiama automaticamente i metodi principali tipo Initialize() Update() Draw() ecc...) però in C++ ma mi mancano le collections, e in più ho un altro dubbio: se la mia collection è di tipo <GameComponent> e i miei componenti sono derivati da questo tipo sono sicuro che richiama i metodi definiti nelle classi derivate e non solo in quella base?

Molto contorto, lo ammetto...
Grazie,
Zarko.

wizard1993
24-05-2009, 21:46
i contenitori della stl

zarko
25-05-2009, 08:54
Grazie, ma da quello che ho capito questi contenitori devono avere un solo tipo, io ho bisogno di inserire elementi di tipo diverso ma derivati dalla stessa classe... con le list sono riuscito a memorizzarli ma solo usando la classe base, inserisco oggetti derivati, ma quando richiamo i loro metodi prende quelli della classe base :cry:

Altre possibilità?

Tommo
25-05-2009, 09:13
Grazie, ma da quello che ho capito questi contenitori devono avere un solo tipo, io ho bisogno di inserire elementi di tipo diverso ma derivati dalla stessa classe... con le list sono riuscito a memorizzarli ma solo usando la classe base, inserisco oggetti derivati, ma quando richiamo i loro metodi prende quelli della classe base :cry:

Altre possibilità?

temo proprio che questo non sia possibile :D
Sicuro che non stai facendo casino con l'inserimento?
Prova a fare una collection di puntatori invece che una collection di oggetti!

zarko
25-05-2009, 11:56
Collection di puntatori... tipo così?


class HUD : GameComponent
{
//...
};

class Model : GameComponent
{
//...
};

class Game
{
public:
HUD* m_pHUD;
Model* m_pModel

list<GameComponent*> GC; //list con la classe base

Game()
{
GC.push_back(m_pHUD);
GC.push_back(m_pModel);
}

void Initialize()
{
for (list<GameComponent*>::iterator i = GC.begin(); i != GC.end(); i++)
{
//??? Se qui voglio chiamare il metodo Initialize di ogni GameComponent cosa metto?
// Posso riconvertire un GameComponent in HUD, Model...
}
}
};


Grazie mille!
Zarko.

tomminno
25-05-2009, 13:25
void Initialize()
{
for (list<GameComponent*>::iterator i = GC.begin(); i != GC.end(); i++)
{
//??? Se qui voglio chiamare il metodo Initialize di ogni GameComponent cosa metto?
// Posso riconvertire un GameComponent in HUD, Model...
}
}
};


Grazie mille!
Zarko.

Se non hai fatto casini con le dichiarazioni delle classi non hai bisogno di riconvertire assolutamente niente, basta che richiami:

for (list<GameComponent*>::iterator i = GC.begin(); i != GC.end(); i++)
{
i->Initialize();
}


Comunque io userei shared_ptr invece dei puntatori

zarko
25-05-2009, 17:07
FUNZIONA!!!!

Se non hai fatto casini con le dichiarazioni delle classi non hai bisogno di riconvertire assolutamente niente, basta che richiami:

for (list<GameComponent*>::iterator i = GC.begin(); i != GC.end(); i++)
{
i->Initialize();
}


Comunque io userei shared_ptr invece dei puntatori

piccolo dettaglio:
(*i)->Initialize();
Comunque grazie mille a tutti!
Zarko.