Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ho sbagliato qualcosa ?(Classi in C++)
Forum - C/C++ - Ho sbagliato qualcosa ?(Classi in C++)

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Segnala al moderatore
Postato alle 15:50
Giovedì, 08/04/2010
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++

  1. #include <iostream>
  2. #include "calcolatrice.h"
  3. using namespace std;
  4.  
  5. int main(){
  6.         Calc c;
  7.         c.x = 10;
  8.         c.y = 20;
  9.         cout<<c.somma()<<endl;
  10.         cout<<c.sottrazione()<<endl;
  11.         cout<<c.moltiplicazione()<<endl;
  12.         cout<<c.divisione()<<endl;
  13.         system("pause");
  14.         return 0;
  15. }




CALCOLATRICE.H
Codice sorgente - presumibilmente C++

  1. class Calc{
  2. public:
  3.         float x;
  4.         float y;
  5.         float somma();
  6.         float sottrazione();
  7.         float moltiplicazione();
  8.         float divisione();
  9.        
  10.         Calc(){
  11.         x = 0;
  12.         y = 0;
  13.         }
  14.  
  15. };




CALOCOLATRICE.CPP
Codice sorgente - presumibilmente C++

  1. #include "calcolatrice.h"
  2.  
  3. float Calc::somma(){
  4.         return Calc::x + Calc::y;
  5. }
  6.  
  7. float Calc::sottrazione(){
  8.         return Calc::x - Calc::y;
  9. }
  10.  
  11. float Calc::moltiplicazione(){
  12.         return Calc::x * Calc::y;
  13. }
  14.  
  15. float Calc::divisione(){
  16.         return Calc::x / Calc::y;
  17. }



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
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 16:41
Giovedì, 08/04/2010

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 ;)

PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 18:36
Giovedì, 08/04/2010
Testo quotato

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).

Testo quotato

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++

  1. 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
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 22:46
Giovedì, 08/04/2010
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 :-)

PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 22:53
Giovedì, 08/04/2010
Testo quotato

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

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 0:46
Venerdì, 09/04/2010
Testo quotato

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 :k:

PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 8:09
Venerdì, 09/04/2010
Diciamo che (per essere pignoli) se avesse scritto il nome della classe per intero non ci sarebbero stati problemi di comprensione:
Testo quotato


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
PM Quote
Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Segnala al moderatore
Postato alle 8:55
Venerdì, 09/04/2010
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?

PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 9:27
Venerdì, 09/04/2010
Testo quotato

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++

  1. class Classe
  2. {
  3.      private:
  4.           int *_vettore;
  5.      public:
  6.           Classe (int n) {
  7.                _vettore = new (int[n]);
  8.           };
  9.           ~Classe () {
  10.                delete [] _vettore;
  11.           };
  12. }


Ultima modifica effettuata da Xaratroom il 09/04/2010 alle 9:28
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo