Newsgroup: it.comp.lang.c++
Titolo: [OT?]Per gli esperti di OOP

,less<Casa>,__default_alloc_template<true,0> >::rb_tree<Casa,
pair<const Casa,Pezzo>, select1st<pair<const Casa,Pezzo> >, less<Casa>,
alloc>(const less<Casa> &)'
/usr/include/g++-2/stl_map.h:86:   instantiated from
`map<Casa,Pezzo,less<Casa>,__default_alloc_template<true,0> >::map<Casa,
Pezzo, less<Casa>, alloc>()'
a.cc:24:   instantiated from here
/usr/include/g++-2/stl_alloc.h:223: cannot declare field `pair<const
Casa,Pezzo>::second' to be of type `Pezzo'
/usr/include/g++-2/stl_alloc.h:223:   since the following virtual
functions are abstract:
/usr/include/g++-2/stl_alloc.h:223:     void Pezzo::spostati()
Quello che mi chiedo e`:
C'e` qualche criterio su cui basarsi per dire che una delle soluzioni
seguenti e` migliore dell' altra (oppure ci sono altre soluzioni ? E
come
si puo` ragionare per stabilire se una e` migliore dell'altra) ?:
   - rinunciare ad avere la classe Pezzo come classe astratta
      (avrei derivato da essa le varie classi
Re,Donna,Torre,Alfiere,Cavallo,Pedone)
  - fare in modo che il membro posizione della classe scacchiera
      non sia una mappa (a proposito: puo` funzionare una map in questo
caso ?)
       ma qualcos'altro   (ma cosa ? Un array di coppie Casa,Pezzo ?)
#include <map>
enum colonna  {a,b,c,d,e,f,g,h};
enum traversa {uno,due,tre,quattro,cinque,sei,sette,otto};
class Pezzo {
public:
    Pezzo() {}
    virtual void spostati(void)=0;
    virtual~ Pezzo(){};
};
class Casa {
public:
    Casa(){}
    virtual ~Casa(){}
};
class Scacchiera {
    Casa casa[8][8];
    map<Casa,Pezzo> posizione;
public:
    Scacchiera(){ };
    virtual ~Scacchiera() {};
};
int main(void) {
    Scacchiera s;
    return 0;
}

        ma qualcos'altro   (ma cosa ? Un array di coppie Casa,Pezzo ?)
A me sarebbe piuttosto venuta in mente una matrice 8 per 8,
usando un opportuno marker per le caselle vuote (ad esempio,
se matrice di puntatori, un puntatore nullo per le caselle vuote;
se di EPezzo, un EPezzo contenente un puntatore nullo...).
Comunque, una map puo` egualmente funzionare (in astratto
una matrice e` solo un caso particolare di "mappa", vedendo
le chiavi come coppie di coordinate) e cosi` pure una lista di
coppie visto che alla fin fine le coppie nella lista sono poche.
Alex

Tempo fa, avevo realizzato una cosa simile in Turbo Pascal. Il pezzo era una
classe astratta, che poi veniva specializzata per i vari pezzi.
I metodi erano cose del tipo
minacciato, disegnati, muovi, ecc.
e tutti insieme stavano in una bella lista, in modo che ad alcune domande
potevano rispondere "in coro".
Ad esempio:
sei minacciato? Aspetta che chiedo ai pezzi avversari se quacuno di loro puň
muovere nella mia casella... no!
Se vuoi, scrivimi in e-mail e te li spedisco (sperando di trovarli), la
conversione in C++ non dovrebbe essere traumatica, e magari riesci a farlo
meglio di me :-)))
Ovviamente non gestivo le mosse del computer, era solo un scacchiera
"intelligente" per 2 umani. Potevi salvare le partite, stampare l'elenco
delle mosse, tornare indietro (barare), ecc.
Forse si poteva pure usare il mouse (sotto DOS), mentre sicuramente c'era
l'evidenziazione della mosse possibili per un pezzo.
Ciao
--
Alessandro Monti

Grazie a tutti.

 Grazie a tutti.
Prova a implementare la regina come eredità multipla da alfiere e torre ...
oppure anche con aggregazione, basta che riusi il codice delle due classi.
Sarebbe interessante vedere se ti riesce e/o ti torna comodo farlo.
-----
Giovanni Bajo
Lead Programmer
Prograph Research S.r.l.
http://www.prograph.it

O, forse meglio, con due classi base astratte, RettoMovente e
ObliquoMovente...
Ciao,
Nicola