Torna indietro   Hardware Upgrade Forum > Software > Programmazione

WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 10-05-2011, 00:01   #1
Sax_93
Member
 
Iscritto dal: Apr 2011
Messaggi: 62
[C++] Programma con le classi derivate

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 è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2011, 00:03   #2
Sax_93
Member
 
Iscritto dal: Apr 2011
Messaggi: 62
P.S
voglio capire cosa sbaglio...
Sax_93 è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2011, 15:23   #3
dileoa
Member
 
Iscritto dal: Sep 2005
Messaggi: 80
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ì:
Codice:
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:
Codice:
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ì:
Codice:
conto cont[MAX];
Ma deve essere fatta utilizzando l'operatore new:
Codice:
cont = new conto[MAX];
La classe conto_corrente l'avrei scritta così:
Codice:
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
dileoa è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2011, 18:41   #4
Sax_93
Member
 
Iscritto dal: Apr 2011
Messaggi: 62
scusami ma il costruttore sarebbe:
nella classe base...
void azzera{
saldo=0;
return;}

inoltre devo usare perforza new?
ke non lo so usare...??
Sax_93 è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2011, 20:37   #5
dileoa
Member
 
Iscritto dal: Sep 2005
Messaggi: 80
In C++ la sintassi dei costruttori è obbligata:
Dichiarazione:
Codice:
class conto
{
  public:
    conto(); //oppure
    conto(... eventuali argomenti...);
}
Definizione
Codice:
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.

Ultima modifica di dileoa : 10-05-2011 alle 20:41.
dileoa è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2011, 20:46   #6
Sax_93
Member
 
Iscritto dal: Apr 2011
Messaggi: 62
beh io uso Dev C++ se lo conosci...
Sax_93 è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2011, 20:54   #7
GByTe87
Senior Member
 
L'Avatar di GByTe87
 
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
Comunque la creazione di istanze di una classe può essere fatta senza problemi col metodo classico, senza new e delete.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO
GByTe87 è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2011, 21:46   #8
dileoa
Member
 
Iscritto dal: Sep 2005
Messaggi: 80
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:
Codice:
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
Codice:
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;
}
dileoa è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2011, 21:56   #9
GByTe87
Senior Member
 
L'Avatar di GByTe87
 
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
Puoi usare l'allocazione statica anche per array di oggetti

es:

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

int main(){
test obj[2] = { { 1, 2 }, { 3, 4 } };
...
}
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO
GByTe87 è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2011, 22:19   #10
Sax_93
Member
 
Iscritto dal: Apr 2011
Messaggi: 62
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;
}
Sax_93 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2011, 15:12   #11
dileoa
Member
 
Iscritto dal: Sep 2005
Messaggi: 80
Modifica così il costruttore:
Codice:
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:
Codice:
class conto
{
  public:
    ...
    ~conto();
};

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

Ultima modifica di dileoa : 20-05-2011 alle 15:27.
dileoa è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
Una tassa di 5,5 centesimi su ogni gigab...
Vuoi clonare un videogioco con l'IA? Cla...
Furto da 6,3 miliardi di dollari, Binanc...
Gli USA dipendono dai robot stranieri: T...
Volkswagen non ha più soldi per l...
Telescopio spaziale Hubble: la NASA cerc...
Più sottile e potente: le nuove i...
Il JPL estende la vita operativa della s...
DAZN Full è in offerta: tutta la ...
GTA 6 su PC potrebbe arrivare prima del ...
Da zero al tracciato in secondi: LibreCo...
Il regista Rian Johnson lancia a 12,99 d...
Microsoft stravolge l'app Sicurezza di W...
Mercato smartphone in caduta libera: -20...
Android 17 QPR3 Beta 3 riporta il blocco...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:46.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v