|
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: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: 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 |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: 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 |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
|
|
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
|