XBarboX (Member)
Guru
Messaggi: 945
Iscritto: 31/12/2008
|
Salve,
sto studiando la programmazione ad oggetti in c++.
Ho fatto questa semplice classe che gestisce le quattro operazioni fondamentali:
MAIN.CPP
Codice sorgente - presumibilmente C++ |
#include <iostream> #include "calcolatrice.h" using namespace std; int main(){ Calc c; c.x = 10; c.y = 20; cout<<c.somma()<<endl; cout<<c.sottrazione()<<endl; cout<<c.moltiplicazione()<<endl; cout<<c.divisione()<<endl; system("pause"); return 0; }
|
CALCOLATRICE.H
Codice sorgente - presumibilmente C++ |
class Calc{ public: float x; float y; float somma(); float sottrazione(); float moltiplicazione(); float divisione(); Calc(){ x = 0; y = 0; } };
|
CALOCOLATRICE.CPP
Codice sorgente - presumibilmente C++ |
#include "calcolatrice.h" float Calc::somma(){ return Calc::x + Calc::y; } float Calc::sottrazione(){ return Calc::x - Calc::y; } float Calc::moltiplicazione(){ return Calc::x * Calc::y; } float Calc::divisione(){ return Calc::x / Calc::y; }
|
Questo sorgente funziona, ma voglio chiedervi tre cose:
1)Ho fatto qualche errore di "bella programmazione"
2)Il distruttore é necessario?
3)Come posso evitare di scrivere ogni volta "Calc::x"? Ovvero é possibile scrivere solo "X" al posto di "Calc::x" ??
Grazie mille
Ultima modifica effettuata da XBarboX il 08/04/2010 alle 15:56 |
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
beh è una classe con non molto senso, ma cmq potresti mettere x e y come privati ed esporli tramite dei getter e dei setter.
Il distruttore non è necessario, cosa ci devi fare dentro?
puoi evitare di usare l'operatore di risoluzione di scopo quando accedi alle variabili membro, basta il nome o this->variabile.
per il resto è una cosa talmente minimale che più di così non si può dire
|
|
Xaratroom (Ex-Member)
Expert
Messaggi: 526
Iscritto: 03/04/2008
|
Postato originariamente da HeDo:
puoi evitare di usare l'operatore di risoluzione di scopo quando accedi alle variabili membro, basta il nome o this->variabile.
|
Forse è stata una svista ma si chiama risolutore di scope (ossia ambito o contesto).
Postato originariamente da HeDo:
per il resto è una cosa talmente minimale che più di così non si può dire |
A parte il controllo su denominatore assente in divisione() (nel quale inserirei un throw) io eviterei (come ha detto HeDo) l'accesso diretto agli attributi, a favore di setter e getter.
Poi inserirei un'altro costruttore:
Codice sorgente - presumibilmente C/C++ |
Calc(float x, float y) ...
|
e utilizzerei una lista di inizializzazione per assegnare i valori agli attributi.
PS: forse rompo un po' ma il nome della classe lo scriverei per intero... Ultima modifica effettuata da Xaratroom il 08/04/2010 alle 18:38 |
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
Una calcolatrice, di per se, ha un accumulatore che contiene l'ultima risposta o answer, abbreviato ANS.
Poi ha una memoria M.
una serie di operazioni aritmetiche e un Input.
Tutte le operazioni avvengono tra ANS e Input.
quindi io metterei nella classe non x,y, ma ANS ed M. E come unico operando esplicito di somma, sottrazione, prodotto e divisione userei un Input (il secondo operando è ANS).
Fatta in questo modo, invece, la calcolatrice non ha senso, diventa solo un contenitore di metodi che, a questo punto, è meglio dichiarare come static e passargli ogni volta i parametri x,y visto che non ha senso usarli come variabili interne, visto che sono scorrelate con un eventuale "stato interno" della calcolatrice :-)
|
|
Xaratroom (Ex-Member)
Expert
Messaggi: 526
Iscritto: 03/04/2008
|
Postato originariamente da TheKaneB:
Una calcolatrice, di per se, ha un accumulatore che contiene l'ultima risposta o answer, abbreviato ANS.
Poi ha una memoria M.
una serie di operazioni aritmetiche e un Input.
Tutte le operazioni avvengono tra ANS e Input.
quindi io metterei nella classe non x,y, ma ANS ed M. E come unico operando esplicito di somma, sottrazione, prodotto e divisione userei un Input (il secondo operando è ANS).
Fatta in questo modo, invece, la calcolatrice non ha senso, diventa solo un contenitore di metodi che, a questo punto, è meglio dichiarare come static e passargli ogni volta i parametri x,y visto che non ha senso usarli come variabili interne, visto che sono scorrelate con un eventuale "stato interno" della calcolatrice :-) |
Non penso che il suo scopo fosse creare una calcolatrice, ma solo fare pratica con la programmazione object oriented, dal momento che è alle prime armi |
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
Postato originariamente da Xaratroom:
Non penso che il suo scopo fosse creare una calcolatrice, ma solo fare pratica con la programmazione object oriented, dal momento che è alle prime armi |
beh ora siamo tra il bastone e la clava, speriamo nel futuro |
|
Xaratroom (Ex-Member)
Expert
Messaggi: 526
Iscritto: 03/04/2008
|
Diciamo che (per essere pignoli) se avesse scritto il nome della classe per intero non ci sarebbero stati problemi di comprensione:
class Calcolo
{
public:
float somma ();
float prodotto ();
....
}
class Calcolatrice
{
private:
float _ans;
public:
bool operazione (char operando, float valore);
float getRisultato ();
...
}
class Calciatore
{
public:
float somma () { return (float)rand(); };
float prodotto () { return (float)rand(); };
float divisione () { while (1); };
...
}
|
EDIT: Ho quotato perchè non mi vedeva il bb code Ultima modifica effettuata da Xaratroom il 09/04/2010 alle 8:12 |
|
XBarboX (Member)
Guru
Messaggi: 945
Iscritto: 31/12/2008
|
Grazie a tutti.
Volevo chiedere ancora una cosa riguardo i costruttori/distruttori:
I costruttori sono obbligatori? Perchè non sempre si ha bisogno di inizializzare le variabili.
E poi il distruttore credo che serva a niente, che te ne fai di dare un valore alle variabili quando finisce il programma?
|
|
Xaratroom (Ex-Member)
Expert
Messaggi: 526
Iscritto: 03/04/2008
|
Postato originariamente da XBarboX:
Grazie a tutti.
Volevo chiedere ancora una cosa riguardo i costruttori/distruttori:
I costruttori sono obbligatori? Perchè non sempre si ha bisogno di inizializzare le variabili.
E poi il distruttore credo che serva a niente, che te ne fai di dare un valore alle variabili quando finisce il programma?
|
Utilizzi un costruttore quando hai bisogno di inizializzare variabili o allocare memoria ad esempio ...
Il distruttore è necessario nel secondo caso: una volta allocata memoria devi deallocarla per evitare memory leak
Codice sorgente - presumibilmente C/C++ |
class Classe
{
private:
int *_vettore;
public:
Classe (int n) {
_vettore = new (int[n]);
};
~Classe () {
delete [] _vettore;
};
}
|
Ultima modifica effettuata da Xaratroom il 09/04/2010 alle 9:28 |
|