dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Elementu liste

 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: 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
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Sat Feb 23, 2008 6:06 pm    Post subject:

OK, liels paldies!
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  
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