PDA

View Full Version : [C++] Programma con le classi derivate


Sax_93
10-05-2011, 00:01
ciao io ho iniziato da poco a lavorare con le classi derivate...
il mio programma dovrebbere essere una specie di banca, dove si inserisce tutti i dati della classe ke ho messo di sotto, poi si preleva il saldo e lo si aggiorna; allostesso modo gli si può agiungere anke dei soldi al saldo tuo e lo si aggiorna sempre...
Io del programma ho trovato degli errori sintattici e non so se il programma funge, mi potete dare una mano e magare spiegarmelo anke?...
Ecco il codice:

#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define MAX 20

class conto {
protected:
int numero_conto;
char intestatario[MAX];
float saldo;

public:
void registra(int numeroc,char intestatar[],float sald){
numero_conto=numeroc;
strcpy(intestatario,intestatar);
saldo=sald;
return;
}

void visualizza(){
cout<<numero_conto;
cout<<intestatario;
cout<<saldo;
return;
}
};

conto cont[MAX];

class conto_corrente : public conto{
char banca[MAX];

public:
void preleva(float preleva_saldo){
saldo-=preleva_saldo;
return;
}

void versa(float versa_saldo){
saldo+=versa_saldo;
return;
}

void mostra(){
cout<<saldo;
return;
}
};

conto_corrente contoC[MAX];

int registra(){
int numero_conto,risposta,i=-1;
char intestatario[MAX];
float saldo;
do{
i++;
cout<<"Inserisci il NUMERO DI CONTO del cliente"<<"%d"<<endl;
cin>>numero_conto;
cout<<"Inserisci l'INTESTATARIO del numero di conto"<<"%d"<<endl;
cin>>intestatario;
cout<<"Inserisci il SALDO del numero di conto del cliente"<<"%d"<<endl;
cin>>saldo;
cont[i].registra(numeroc,intestatar,sald);
conut<<"Vuoi inserire un altro cliente? (0=NO 1=SI)"<<endl;
cin>>risposta;
}while(risposta==1);
return i;}

void preleva_soldi(){
int k=0,risposta1;
float preleva_saldo;
do{
cout<<"Quanto vuoi prelevare?";
cin>>preleva_saldo;
contoC[k].preleva(preleva_saldo);
cout<<"Vuoi prelevare altri soldi? (0=NO 1=SI)"<<endl;
cin>>risposta1;
}while(risposta1==1);
return;}

void versa_soldi(){
int j=0,risposta2;
float versa_saldo;
do{
cout<<"Quanto vuoi versare?";
cin>>versa_saldo;
contoC[j].versa(versa_saldo);
cout<<"Vuoi versare altri soldi? (0=NO 1=SI)"<<endl;
cin>>risposta2;
}while(risposta2==1);
return;}

void visualizza_saldo(){
cout<<"Il tuo saldo e': "<<"%5.2f"<<mostra.saldo;
return;}

main(){
registra();
preleva_soldi();
versa_soldi();
visualizza_saldo();
system("PAUSE");
return 0;
}

Sax_93
10-05-2011, 00:03
P.S
voglio capire cosa sbaglio...

dileoa
10-05-2011, 15:23
Innanzi tutto, ritengo debba mettere un po' d'ordine nel listato. Nella classe conto hai definito inline due funzioni che inline non dovrebbero essere. Io avrei scritto così:

class conto
{
public:
void registra(int numeroc,char intestatar[],float sald);
void visualizza();
protected:
int numero_conto;
char intestatario[MAX];
float saldo;
};

void conto::registra(int numeroc,char intestatar[],float sald)
{
numero_conto=numeroc;
strcpy(intestatario,intestatar);
saldo=sald;
}

void conto::visualizza()
{
cout<<numero_conto;
cout<<intestatario;
cout<<saldo;
}

Manca il costruttore. Ciò vuol dire che lasci al compilatore l'inizializzazione dell'oggetto (si può fare per carità, ma...), pertanto avrei inserito un costruttore:

class conto
{
public:
conto();
void registra(int numeroc,char intestatar[],float sald);
void visualizza();
protected:
int numero_conto;
char* intestatario;
float saldo;
};

conto::conto()
{
intestatario=new char[MAX];
numero_conto=0;
saldo=0;
}

void conto::registra(int numeroc,char intestatar[],float sald)
{
numero_conto=numeroc;
strcpy(intestatario,intestatar);
saldo=sald;
}

void conto::visualizza()
{
cout<<numero_conto;
cout<<intestatario;
cout<<saldo;
}

Non ne sono certo, ma la creazione di un array di un oggetto complesso come una classe non può essere fatta così:

conto cont[MAX];

Ma deve essere fatta utilizzando l'operatore new:

cont = new conto[MAX];

La classe conto_corrente l'avrei scritta così:

class conto_corrente : public conto
{
public:
conto_corrente(); //costruttore
void preleva(float preleva_saldo)){saldo-=preleva_saldo;}; // definita inline
void versa(float versa_saldo){saldo+=versa_saldo;}; // definita inline
void mostra(){cout<<saldo;}; definita inline
private:
char* banca;
};

conto_corrente::conto_corrente: conto() //chiamata al costruttore della classe base
{
banca=new char[MAX];
}

Tieni presente che gli oggetti costruiti dinamicamente con new devono poi essere esplicitamente distrutti con delete. Pertanto nelle due classi avrei inserito i relativi distruttori.
Per il programma principale vedrò di darti qualche consiglio non appena avrò sottomano il compilatore c++.
A presto
ADL

Sax_93
10-05-2011, 18:41
scusami ma il costruttore sarebbe:
nella classe base...
void azzera{
saldo=0;
return;}

inoltre devo usare perforza new?
ke non lo so usare...??

dileoa
10-05-2011, 20:37
In C++ la sintassi dei costruttori è obbligata:
Dichiarazione:

class conto
{
public:
conto(); //oppure
conto(... eventuali argomenti...);
}

Definizione

conto::conto()
{
...
}

conto::conto(...argomenti...)
{
...
}

in questa forma il costruttore è eseguito automaticamente ogni volta che un oggetto della classe è creato. Purtroppo new e delete sono operatori fondamentali nel C++ e il loro uso deve essere ben conosciuto. Ti suggerirei di leggere qualche manuale. Ottimo e gratuito "Thinking in c++" scaricabile da internet.;)

Sax_93
10-05-2011, 20:46
beh io uso Dev C++ se lo conosci...

GByTe87
10-05-2011, 20:54
Comunque la creazione di istanze di una classe può essere fatta senza problemi col metodo classico, senza new e delete. :D

dileoa
10-05-2011, 21:46
Anch'io ho usato DEV C++. Il discorso dei costruttori è indipendente dall'IDE. Per quanto riguarda l'uso di new e delete temo di essere stato frainteso. new e delete vanno utilizzati essenzialmente per creare array di oggetti.
Il codice per istanziare un oggetto è molto più semplice:

class conto
{
public:
conto();
conto(...eventuali argomenti---);
...
};

main()
{
conto mioconto;
conto tuoconto(...eventuali argomenti...);
...
mioconto.visualizza();
...
}

Dovendo creare un array di oggetti conto allora si deve usare new

main()
{
conto mioconto;
conto tuoconto(...eventuali argomenti...);
conto* conti;
conti = new conto[10];
...
mioconto.visualizza();
...
for(int i=0;i<10;i++)conti[i]->visualizza();
...
delete[]conti;
}

GByTe87
10-05-2011, 21:56
Puoi usare l'allocazione statica anche per array di oggetti :)

es:



class test {
public:
test(int a, int b) {
cout << a << b << endl;
}
};

int main(){
test obj[2] = { { 1, 2 }, { 3, 4 } };
...
}

Sax_93
19-05-2011, 22:19
raga ho rifatto il codice ma mi crasha dopo metto il saldo mi aiutate a sistemarlo velocemente perfavore?
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define MAX 20

class conto
{
public:
conto();
void registra(int numeroc,char intestatar[],float sald);
void visualizza();
protected:
int numero_conto;
char* intestatario;
float saldo;
};

conto::conto()
{
saldo=0;
}

void conto::registra(int n,char i[],float s)
{
numero_conto=n;
strcpy(intestatario,i);
saldo=s;
}

void conto::visualizza()
{
cout<<numero_conto;
cout<<intestatario;
cout<<saldo;
}

conto cont[MAX];

class conto_corrente : public conto
{
private:
char banca[MAX];
public:
void preleva(float preleva_saldo){saldo-=preleva_saldo;};
void versa(float versa_saldo){saldo+=versa_saldo;};
void mostra(){cout<<saldo;};
};

conto_corrente contC[MAX];

int registra(){
int numeroc,risposta,i=-1;
char intestatar[MAX];
float sald;
do{
i++;
cout<<"Inserisci il NUMERO DI CONTO del cliente "<<i+1<<endl;
cin>>numeroc;
cout<<"Inserisci l'INTESTATARIO del numero di conto "<<i+1<<endl;
cin>>intestatar;
cout<<"Inserisci il SALDO del numero di conto del cliente "<<i+1<<endl;
cin>>sald;
cont[i].registra(numeroc,intestatar,sald);
cout<<"Vuoi inserire un altro cliente? (0=NO 1=SI)"<<endl;
cin>>risposta;
}while(risposta==1);
return i;}

void preleva(){
int k=0,risposta1;
float preleva_saldo;
do{
cout<<"Quanto vuoi prelevare?";
cin>>preleva_saldo;
contC[k].preleva(preleva_saldo);
cout<<"Vuoi prelevare altri soldi? (0=NO 1=SI)"<<endl;
cin>>risposta1;
}while(risposta1==1);
return;}

void versa(){
int j=0,risposta2;
float versa_saldo;
do{
cout<<"Quanto vuoi versare?";
cin>>versa_saldo;
contC[j].versa(versa_saldo);
cout<<"Vuoi versare altri soldi? (0=NO 1=SI)"<<endl;
cin>>risposta2;
}while(risposta2==1);
return;}

void visualizza_saldo(){
int k;
cout<<"Il tuo saldo e': ";
contC[k].mostra();
return;}

main(){
registra();
preleva();
versa();
visualizza_saldo();
system("PAUSE");
return 0;
}

dileoa
20-05-2011, 15:12
Modifica così il costruttore:

conto::conto()
{
numero_conto=0;
intestatario=new char[MAX];
saldo=0;
}

In questo modo allocherai lo spazio di memoria necessario per memorizzare la stringa di caratteri.
Dovrai, inoltre, inserire anche un distruttore:

class conto
{
public:
...
~conto();
};

conto::~conto()
{
delete[]intestatario;
}

ADL