Newsgroup: it.comp.lang.c++
Titolo: Generalizzazioni di classe

Problema:
ho una classe "Carta", generica. Da questa classe voglio ereditare "Carta
italiana" e "Carta francese". E fin qua, nessun problema.
Ho una classe "Mazzo". Nella sezione public di "Mazzo", c'e`:
	vector<Carta> contenuto;
..il problema e` che voglio che "Mazzo" generalizzi il suo contenuto con
"Carta", ma che effettivamente le carte all'interno di "contenuto" rimangano
della classe originaria (ovvero una delle due derivate).
Invece sembra che con un
	contenuto.insert(contenuto.end(),c) // dove c e` dichiarato come Carta
					    // nel prototipo
la derivata venga castata verso l'alto, perdendo le proprieta` della derivata.
Any hint?
Adieu,
-- 
Lestat de Lioncourt  -- a.k.a --  Ciro Mattia Gonano
 Undergraduate student in Computer Science at University of Bologna
 IHGGer #1049   <=>  ICQ#: 52631406   <=>   URL: 
http://www.CS.UniBO.It/~gonano
 Debian admin at 
Students.CS.UniBO.It
 <=> look at headers for my JabberID & GPG

  Debian admin at 
Students.CS.UniBO.It
 <=> look at headers for my JabberID
& GPG
sai cosa si dice di chi usa debian?
hihihi
ciao,
 Sbirish

 la derivata venga castata verso l'alto, perdendo le proprieta` della derivata.
Il cosiddetto 'slicing'. Quando copi un oggetto di una classe derivata
in un oggetto della classe base, le parti specifiche della classe
derivata vengono "affettate via".
Ciao,
Nicola

>Any hint?
In questo modo eviti che capiti quello che ti succedeva e tutto funziona a
dovere!
Ho dato questa soluzione perche' pensavo fosse quella piu' vicina a quello
che chiedevi. Altrimenti anche la soluzione di Sbirish, i template, va bene.
Tommy

 
no, che si dice di bello? :)
Adieu,
-- 
Lestat de Lioncourt  -- a.k.a --  Ciro Mattia Gonano
 Undergraduate student in Computer Science at University of Bologna



ottimo, ma in questa maniera nella classe base devo implementare, virtualmente o
meno, TUTTE le funzioni e i membri propri delle derivate... questo non va ad
appesantire il tutto?
Non ho necessita` di avere un mazzo incoerente (un mazzo conterra` solo un tipo
di carte alla volta) ma volevo che la classe Mazzo potesse contenere delle
classi derivate da Carta.
In pratica la soluzione del template, ma il template non lo volevo usare :p
Adieu,
-- 
Lestat de Lioncourt  -- a.k.a --  Ciro Mattia Gonano
 Undergraduate student in Computer Science at University of Bologna



Ciao,
se non vuoi usare i templates, allora la soluzione di Tommy dovrebbe andarti
a fagiolo senza nessun appesantimento penso:
namespace game
{
   enum {BASTONI, COPPE, DENARI, SPADE};
   enum {CUORI, QUADRI, FIORI, PICCHE};
}
class CCard
{
public:
   CCard(int fam, int val) : mVal(val), mFam(fam) {}
   void SetFamVal(int fam, int val) {mFam = fam; mVal = val;}
   void GetFamVal (int &fam, int &val) const {fam = mFam; val = mVal;}
   int GetIdCard();
   virtual ~CCard() {}
   CCard();
protected:
   int mVal;
   int mFam;
private :
};
class CCardItalian : public CCard
{
public:
   CCardItalian() : CCard(1, game::BASTONI) {}
   CCardItalian(int fam, int val) : CCard(fam, val) {}
   ~CCardItalian() {}
};
class CCardFrench : public CCard
{
public:
   CCardFrench() : CCard(1, game::CUORI) {}
   CCardFrench(int fam, int val) : CCard(fam, val) {}
   ~CCardItalian() {}
};
typedef std::vector<CCard *> VecPCards;
class CDeck
{
public:
   CDeck(int numCards, int numFams);
   void ShuffleDeck();
   int GetNumCards() const {return mNumCards;}
   bool GiveMeACard (const CGameCard* &card);
   virtual ~CDeck() {}
   VecPCards shuffledDeck;
protected :
   int mNumCards;
   int mNumFams;
   int mCurPos;
   VecPCards mDeck;
private :
   CDeck();
};
Come vedi nella classe CDeck (Mazzo) c'e' il vettore che contiene puntatori
ad oggetti CCard, per cui poi sfruttando il polimorfismo puoi andare a
prendere il puntatore dal mazzo usando i metodi di CCardItalian o di
CCardFrench a seconda di quale puntatore a oggetto vi e' inserito.
Non hai appesantito il tutto perche' i metodi generici delle carte li lasci
nella classe base CCard e gli altri piu' specialistici li implementi nelle
sue derivate.
Maurus