PDA

Visualizza la versione completa : [C++] Classi e derivate per rappresentazione personaggio


TheDark191
11-02-2011, 20:58
Salve a tutti!
Sono iscritto alla facoltà di ingegneria informatica al primo anno,ho dato da poco l'esame di fondamenti d'informatica,è andato benissimo e sono contento perchè mi piace un sacco programmare.Però il corso,per mia sfortuna,si è concluso proprio qualche lezione prima della programmazione ad oggetti,classi,metodi ecc... perchè sono argomenti che affronterò nel corso di programmazione I,ma la mia curiosità è infinita quindi mi sono documentato da solo e ho letto un po su questo sito riguardo classi e classi derivate.
Ora la mia domanda è questa:

Supponendo di voler fare una classe PERSONAGGIO

questa classe avrà un costruttore e un distruttore vuoto.
avrà variabili e funzioni publiche.
char* nome;
int vita;
int attacco;

e funzioni
void stampa_caratteristiche();
void attacco_speciale();

Questa è la mia classe.Ora voglio appunto creare due diversi personaggi,che hanno in comune le variabili nome,vita,attacco e la funzione stampa_caratteristiche(),però voglio che abbiano la funzione attacco_speciale() differenti!
per fare una cosa del genere avrei bisogno di una classe che derivi da questa giusto?
QUindi la funzione attacco_speciale() la tolgo dalla classe PERSONAGGIO e l'aggiungo alla classe derivata così la creo per il mio personaggio creato.
Diciamo che tutto questo è una mia supposizione,perchè ad implementarlo non ci riesco xD
perchè non riesco ad assegnare dei valori alle variabili?(mi da errore)
come posso fare per implementare ciò che voglio fare in teoria?

questo che ho fatto è un esempio,non voglio implementare un gioco o qualcosa del genere perchè sarebbe impossibile con le mie conoscenze e soprattutto senza sapere programmare al di fuori del dos e senza directX ^^"

lolide
11-02-2011, 23:09
Intanto mi raccomando impara anche la nomenclatura standard per la programmazione ad oggetti.

le classi si scrivono con la prima lettera maiuscola ed il resto in minuscolo (se vuoi accodare altre parole, vale la stessa cosa: es. Persona, PersonaGiuridica ecc..)

i nomi dei metodi anch'essi ogni parola va scritta con la prima lettera maiuscola ed il resto minuscolo, tranne la prima, cioè: stampaCaratteristiche, getNome, setNome ecc...

se usi un attributo (si chiamano così, non più variabili) char*, ovviamente il costruttore della classe non può essere vuoto (devi allocare la memoria per l'attributo con malloc o new) e neanche il distruttore (devi liberare la memoria per l'attributo).

Passiamo al codice: per come la penso io Personaggio sarà una classe virtuale (se ci pensi bene, non esiste nella realtà un personaggio "Personaggio", esiste ad esempio, pensando ad un gioco di ruolo :D, "Marziano", "Vulcaniano", "Terrestre" che estenderanno la classe virtuale Personaggio).

Pero il metodo stampaCaratteristiche() lo definirei anche in Personaggio, magari stampa alcune caratteristiche comuni a tutti i personaggi come livelloVita, altezza, potenza ecc....

Poi se la classe Marziano ad esempio ha una caratteristica particolare, fai l'override del metodo (non si chiamano più funzioni :)) stampaCaratteristiche() facendogli stampare le caratteristiche comuni + quella particolare di quella classe, es:



class Personaggio {
public:
int livelloVita;
char* nome;
int potenza;
....
public:
std::string stampaCaratteristiche() {
std::string stringa ("");
stringa += "Vita: ";
stringa += livelloVita;
....

return stringa;
};
};

class Marziano : virtual public Personaggio {
public:
// ridefinendo il metodo nello stesso modo, faccio l'override del metodo della superclasse
std::string stampaCaratteristiche () {
std::string stringa = Personaggio::stampaCaratteristiche();

stringa += "\nColore: Verde";

return stringa;
};
};

TheDark191
12-02-2011, 02:56
Quindi mi creo un metodo nella classe principale e nelle classi derivate modifico solo un aspetto di quella metodo giusto?
Volevo sapere un'altra cosa.Una volta che creo classi e sottoclassi,le assegnazioni degli attributi vanno dati nel main? non posso creare un altro file in cui setto tutti gli attributi e questo file lo richiamo nel main? così per tenere le cose più ordinate...
Un'ultima cosa:
Quel "virtual public" inserito nella creazione della classe derivata cosa significa??

lolide
12-02-2011, 11:04
Originariamente inviato da TheDark191
Quindi mi creo un metodo nella classe principale e nelle classi derivate modifico solo un aspetto di quella metodo giusto?


Si. Il polimorfismo sta alla base della OOP.


Originariamente inviato da TheDark191
Volevo sapere un'altra cosa.Una volta che creo classi e sottoclassi,le assegnazioni degli attributi vanno dati nel main? non posso creare un altro file in cui setto tutti gli attributi e questo file lo richiamo nel main?

Cosa intendi per file ?
Un altro concetto che sta alla base della OOP è l'incapsulamento.
Gli attributi, tranne in rarissimi casi vanno dichiarati sempre privati o protetti, in quanto al setting(assegnazione)/getting(recupero) degli attributi ci devono pensare i cosiddetti metodi accessori.


Originariamente inviato da TheDark191
Quel "virtual public" inserito nella creazione della classe derivata cosa significa??

In C++ una classe virtuale (che non può essere instanziata), non è dichiarata tale nel prototipo della classe, ma nel azione di ereditarla.

Quindi usando virtual public ho dichiarato che la classe ereditata è virtuale.

Ti consiglio di leggerti qualche guida sulla programmazione ad oggetti, in quanto partire a programmare in modo scorretto, nell'azione di correzione del metodo di programmazione ti porterai anche dei metodi scorretti.

In questo caso su HTML.it (:unz: ) c'è una buona guida (http://programmazione.html.it/guide/leggi/38/guida-programmazione-orientata-agli-oggetti/) con cui iniziare a capire certi concetti.

TheDark191
12-02-2011, 11:45
Ora mi è chiara la teoria più o meno ma mi hai fatto sorgere un altro dubbio:
Qual è la differenza tra protetti e privati? privati significa che al di fuori dei metodi non posso utilizzare gli attributi?
Però nel mio esempio io ho bisogno di richiamare l'attributo Vita al di fuori dei metodi,altrimenti come faccio a farla diminuire o aumentare tramite funzioni o metodi di altre classi?

lolide
12-02-2011, 12:21
Originariamente inviato da TheDark191
Ora mi è chiara la teoria più o meno ma mi hai fatto sorgere un altro dubbio:
Qual è la differenza tra protetti e privati? privati significa che al di fuori dei metodi non posso utilizzare gli attributi?

Sta scritta nella guida che t'ho linkato poco fa ;)


Originariamente inviato da TheDark191
Però nel mio esempio io ho bisogno di richiamare l'attributo Vita al di fuori dei metodi,altrimenti come faccio a farla diminuire o aumentare tramite funzioni o metodi di altre classi?

Secondo te c'è differenza tra fare così:


class Personaggio {
private:
int vita;
public:
void setVita (int nuovaVita) {
vita = nuovaVita;
};
int getVita () {
return vita;
};
}

int main () {
Personaggio p;
p.setVita(1); // vita = 1
p.setVita(p.getVita()++); // incremento vita
}

oppure così:


class Personaggio {
public:
int vita;
}

int main () {
Personaggio p;
p.vita = 1;
p.vita = p.vita++;
}

Secondo me una differenza c'è: vedi, usare le classi è molto più che definire un "namespace" per delle variabili (sennò fai prima ad usare il C con le struct ecc...)
Se volessi controllare che una persona non inserisca una vita inferiore a 0 ?
Quel controllo è un tipo di comportamento dell'oggetto: se lavori ad oggetti non puoi fare quei tipi di controlli fuori dalla classe, altrimenti non ha senso l'uso della programmazione ad oggetti.

Ti ripeto, questa mentalità la acquisisci programmando e studiando la OOP.
Leggiti la guida che ti ho linkato su, oppure leggiti un bel libro sulla OOP come ce ne sono a centinaia, e cerca di acquisisre il giusto metodo di programmazione dall'inizio, perchè sennò gli sbagli te li porterai sempre ;)

:ciauz:

TheDark191
12-02-2011, 15:38
bene ho capito! allora comincerò a leggermi qualcosa sulla programmazione ad oggetti in questi mesi di attesa per il corso di programmazione I.

Grazie per tutto! :ciauz:

Loading