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

Projekta organizēšana

 
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: Wed Jan 23, 2008 6:57 pm    Post subject: Projekta organizēšana

Ir tā, ka mana projektā ir Clients un Serveris. Tā kā User, Game, Object utt. klases ir lizīgas gan klientam, gan serverim, tad ir viena common klase, no kuras pēc tam derivējas, piemēram, CUser un SUser (attiecīgi klientam un serverim). Tas vajadzīgs tādēļ, ka klientam ir vajadzīgas savas papildus fīčas (grafiskas), bet serverim savas. Problēma rodas ar manageriem. Ir klases GameManager, UserManager utt. kas veido objektus (createGame, createUser ...), bet šajās funkcijās viņi veido new Game un new User. Kā būtu pareizāk to darīt t.i. kā lai panāk, ka tiek veidota CGame un CUser?

Pagaidām prātā nāk 2 veidi:
1. derivēt funkciju create... (bet problēma tāda, ka ja common klases funckionalitātē kaut kas mainās, tad var aizmirsties samianīt derivēto funkciju)
2. izmantot templeitus un pēc tam ar GameManager<CGame>::createGame(), tā izveido vajadzīgo objektu (šis liekas tāds nedaudz nestandartāks).

Ir vēl kāds variants?
_________________
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: Wed Jan 23, 2008 8:38 pm    Post subject: Re: Projekta organizēšana

elvman wrote:
1. derivēt funkciju create... (bet problēma tāda, ka ja common klases funckionalitātē kaut kas mainās, tad var aizmirsties samianīt derivēto funkciju)

Iznes kopīgo ārā no create metodes. Un izsauc no apakšklašu metodēm. Koda dublēšanās nekad nav bijusi laba lieta.

Quote:
2. izmantot templeitus un pēc tam ar GameManager<CGame>::createGame(), tā izveido vajadzīgo objektu (šis liekas tāds nedaudz nestandartāks).

Šis ir diezgan standartisks paņēmiens mūsdienu C++ pasaulē. Tāpēc jau arī templeiti tika izgudroti. Skat, piemēram, cik ērti templeiti saiet kopā ar std::vector
Code:
template <class Game>
GameManager
{
public:
  Game* createGame()
  {
    all_games.push_back(new Game());
    return all_games.back();
  }

  // ...

private:
  std::vector<Game*> all_games;
};

Ja to Game/User manager klašu darbības principi ir līdzīgi, tad varbūt ir iespējams pat izmest to Game/User nosaukumu no Manager vārda ārā:
Code:
template <class T> class Manager { ... }
t.i. vispārināt to menedžeri.
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: Thu Jan 24, 2008 1:17 pm    Post subject:

NU ja visi manageri darītu vienu un to pašu, tad es viņus nekad nedalītu atsevišķi, protams izmantotu templeitus. Bet tagad par šo gadījumu ritīgi jāpadomā, lai pēc tam nesanāk dēļ dažām lietām, ko neņēmu vērā pārrakstīt visu kodu.
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Tue Jan 29, 2008 11:21 pm    Post subject:

Ok, atkal jautājums par organizēšanu.
Precompiled headerī faili tiek includoti sekojoši:
game.h
gamemanager.h
...
cgame.h
cgamemanager.h

CGameManager klase:
class CGameManager: public GameManager<CGame>

Problēma tāda, ka sanāk unresolved external symbol "public: __thiscall lith::GameManager<class lith::CGame>::GameManager<class lith::CGame>(void)"

jo GameManager.cpp fails tiek kompilēts pirms CGameManager. VIenvārdsakot vajadzētu build order pamainīt, bet īsti neatradu kā.
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Tue Jan 29, 2008 11:38 pm    Post subject:

Nu ok, uzgooglēju, ka visas template funkcijas jāliek header failā. Laikam tas ir vienīgais variants.
_________________
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: Tue Jan 29, 2008 11:41 pm    Post subject:

Ar prekompilētajiem headeriem te ir maz sakara. Un "unresolved external symbol" veida kļūdas objektfailu linkošanas kārtība nu nekādi nesalabos.

It kā pēc C++ standarta kompilētājiem vajadzētu uzturēt eksportētos templeitus (t.i. tad, kad to implementācija ir cpp failā). Taču gan msvc, gan gcc šajā ziņā īsti labi neizpildās. Kautkāds to eksportēto templeits ir, taču pašu export keywordu tie nesupportē.

Šo, btw, tu man jau IRC'ā viendien jau prasīji - par templeitu likšanu cpp/h failos :)
Back to top
View user's profile Send e-mail
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