|
dev.gamez.lv Latvian Game Developers Community
|
View previous topic :: View next topic |
Author |
Message |
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sat Feb 23, 2008 2:52 pm Post subject: Elementu liste |
|
Ir klase:
Code: | class Game
{
vector<User*> GetPlayers() const { return mPlayers; }
protected:
vector<User*> mPlayers;
}; |
Pēc tam spēlētājus dabūju šādi:
Code: | for(vector<User*>::iterator i = game->GetPlayers().begin(); i!= game->GetPlayers().end(); i++)
{
//un izmetās errors
} |
Dažos gadījumos šāds variants strādā, bet dažos izmet runtime erroru. Laikam šāds veids ka dabūt sarakstu nav īpaši labs vai arī neesmu ņēmis vērā kādus sīkumus. _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sat Feb 23, 2008 3:52 pm Post subject: |
|
Pirmām kārtām - nedrīkst salīdzināt iteratorus no diviem dažādiem konteineriem!
Tavs for cikls tiek kompilēts šādā veidā:
Code: | vector<User*> temp1 = game->GetPlayers();
vector<User*>::iterator i = temp1.begin()
while (true)
{
vector<User*> temp2 = game->GetPlayers();
vector<User*>::iterator tmp_i = temp2.end();
if (i == tmp_i) // ***
{
break;
}
// ...
i++;
} |
Rindiņā ar *** tu salīdzini iteratorus no diviem dažādiem konteineriem - temp1 un temp2. Tas ir neatļauti.
Jādara ir šādi:
Code: | vector<User*> players = game->GetPlayers();
for(vector<User*>::iterator i = players.begin(); i!= players.end(); i++)
{
// ...
} |
Otrām kārtām - man personīgi liekas nepareizi un nepieņemami, ka getteris, kas ir const - atgriež CITU vektoru katru reizi, kad izsauc GetPlayers metodi, tb katru reizi atgriež tava mPlayers vektora KOPIJU! Ja tu pamainīsi šo atgriezto vektoru (push_back/pop_back), tad oriģinālais vektors (mPlayers) NETIKS izmainīts!
Es būtu darījis šādi:
Code: | class Game
{
const vector<User*>& GetPlayers() const { return mPlayers; }
|
Atgriežam konstantu referenci uz Game::mPlayers memberu. Šādā gadījumā, kad GetPlayers() vienmēr atgriež vienu un to pašu konteineru (jo reference), tad tavs sākotnējais kods, ar diviem GetPlayers() izsaukumiem for ciklā strādās pareizi.
Un trešām kārtām - ieteikums tev lietot typedef:
Code: | class Game
{
typedef vector<User*> Players;
const Players& GetPlayers() const { return mPlayers; }
protected:
Players mPlayers;
};
for(Game::Players::iterator i = game->GetPlayers().begin(); i!= game->GetPlayers().end(); i++)
{
// ...
} |
Gan kods izskatās tīrāks (imho) un galvenais ieguvums - ērti būs pamainīt vektoru uz list vai set, vai map, ja nepieciešams. To vajadzēs darīt tikai vienā vietā - tajā typedef'ā. Citādi tavā variantā nāksies visās n-tajās vietās, kur izmanto šo mPlayers konteineri mainīt vector<..> uz kocitu<..> |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sat Feb 23, 2008 6:06 pm Post subject: |
|
OK, liels paldies! _________________ long time; /* know C */ |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|