Newsgroup: it.comp.lang.c++
Titolo: Aiuto con esercizio Deitel & Deitel (newbe)

Ciao a tutti, ho comprato un libro BASE sul c++ perchè mi ha sempe
incuriosito questo linguaggio; mi sono bloccato ad un esercizio penso
per voi elementare, dove diceva di costruire una classe con 3 funzioni
membro, un dato membro, un costruttore e due oggetti della
classe...quindi creare un programma che testi queste funzioni. Il
problema è che il compilatore mi dà questo errore:
error C2228: left of '.credit' must have class/struct/union
error C2228: left of '.debit' must have class/struct/union
error C2228: left of '.getBalance' must have class/struct/union
3.12 - 3 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped
==========
...da quello che ho capito l'errore sta nel costruttore, ma il libro
fino a quel punto fa esempi passando al costruttore solo valori string
e così mi sono piantato...potete darmi una mano...magari anche
spiegando cosa è successo??....grazie in anticipo
Alex
...di seguito i file che compongono il programmino:
***********Conto_corrente_3_12.h*****************
//Conto Corrente
//file di intestazione per la classe Account
#include <iostream>
using namespace std;
class Account
{
public:
	Account (int );//Costruttore
	void setsaldo(int); //controllo costruttore
	void debit (int);//Funzione per deposito contante
	void credit(int);//funzione per ritiro contante
	int getBalance( );//Visualizza il saldo
private:
	int saldo; // dato membro che contiene il saldo del conto
};
***********Conto_corrente_3_12.cpp**************
/Codice sorgente della classe Account
#include <iostream>
#include "Conto_corrente_3_12.h"
using namespace std;
Account::Account ( int valore)
{
setsaldo (valore);
}
void Account::setsaldo (int valore)
{
	cout << "Inserisci valore iniziale del saldo !";
	cin >> valore;
	if (valore >= 0)
		saldo = valore;
	if (valore < 0)
		cout <<"Valore immesso non valido...procedo con inizializzazione a
0";
		saldo = 0;
}
void Account::credit ( int credito)
{
	saldo = saldo + credito;
}
void Account::debit (int debito)
{
	if (debito > saldo)
		cout << "Impossibile procedere!! Fondi insufficienti !\n" << endl;
	if (debito < saldo)
	saldo = saldo - debito;
}
int Account::getBalance()
{
	return saldo;
}
*********onto_corrente.cpp*************
#include <iostream>
#include "Conto_corrente_3_12.h"
using namespace std;
int main ()
{
	int scelta , importo, importo_d;
	Account movimenti();//oggetto della classe account
	Account listaMovimenti();//secondo oggetto della classe account
	cout <<"******CONTO CORRENTE********\n\n" <<"Operazioni disponibili:
\n" <<
		"1= Deposito contanti!\n"<<"2= Ritiro Contanti\n"<< "3= Saldo Attuale
\n"<<
		"\nFai la tua scelta!\n" << endl;
	cin >> scelta;
	if (scelta = 1)
	{
		cout << "Inserisci l'importo che vuoi versare!" << endl;
		cin >> importo;
		movimenti.credit(importo);
	}
	if (scelta =2)
	{
	cout << "Quanto vuoi ritirare ?\n";
	cin >> importo_d;
	movimenti.debit(importo_d);
	}
	if (scelta =3)
		listaMovimenti.getBalance();
	system ("PAUSE");
	return 0;
}

 	Account listaMovimenti();//secondo oggetto della classe account
Idem.
http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.2
  bye
	av.

         av.
Ciao, purtroppo non ho risolto...quello che non quadra è sempre il
costruttore...il problema è che studiandolo da solo....non riesco a
capire nemmeno il problema dove sia :-((
Ciao
Alex

 capire nemmeno il problema dove sia :-((
Magari dicci che errori da ora, dopo questa correzione...
In ogni caso hai un solo costruttore, Account (int ), quindi non puoi 
scrivere:
Account movimenti;
O scrivi
Account movimenti(0); //Dove 0 e' un numero che ho messo a caso
Oppure devi definire anche un costruttore senza parametri:
Account();
  bye
	av.

Allora, usando il costruttore nel modo Account () ...modificando
nel .h mi ritorna questo errore:
overloaded member function not found in 'Account'
...se modifico Account (int)...sempre nel .h mi torna:
error C2512: 'Account' : no appropriate default constructor available
ma questo SOLO se lascio "account movimenti" senza parametri.
Ho capito che devo mettere:
1) Account (int i= 0) ...nel .h e lasciare account movimenti invariato
oppure
2) Account (int) e modificare account movimenti(0) nel sorgente.
..quale è più corretto ???
ALTRA DOMANDA: pur compilando non riesco a capire perchè se metto 0
come parametro a movimenti,
mi salta i cicli if nel costruttore e se chiedo direttamente il saldo
mi torna anzichè 0.....-858993460
Riporto di seguito i file che compongono il programmino..con il
parametro a 0:
***********Conto_corrente_3_12.cpp**************
//Codice sorgente della classe Account
#include <iostream>
#include "Conto_corrente_3_12.h"
using namespace std;
Account::Account (int i)
{
	if (i>0)
		saldo = i;
	if (i=0)
	{
		cout << "Inserisci saldo iniziale!\n" << endl;
		cin >> i;
		saldo = i;
	}
	if (i<0)
	{	cout <<"Valore immesso non valido...procedo con inizializzazione a
0\n";
		i = 0;
		saldo = i;
	}
}
void Account::credit ( int credito)
{
	saldo = saldo + credito;
}
void Account::debit (int debito)
{
	if (debito > saldo)
		cout << "Impossibile procedere!! Fondi insufficienti !\n" << endl;
	if (debito < saldo)
	saldo = saldo - debito;
}
int Account::getBalance()
{
	return saldo;
}
************Conto_corrente_3_12.h*************
//Conto Corrente
//file di intestazione per la classe Account
#include <iostream>
using namespace std;
class Account
{
public:
	Account(int);//Costruttore
	void debit (int);//Funzione per deposito contante
	void credit(int);//funzione per ritiro contante
	int getBalance( );//Visualizza il saldo
private:
	int saldo; // dato membro che contiene il saldo del conto
};
***********Conto_corrente.cpp****************
#include "Conto_corrente_3_12.h"
using namespace std;
int main ()
{
	int scelta , importo, importo_d;
	Account movimenti(0);//oggetto della classe account
	//Account movimenti2;//secondo oggetto della classe account
	cout <<"******CONTO CORRENTE********\n\n" <<"Operazioni disponibili:
\n" <<
		"1= Deposito contanti!\n"<<"2= Ritiro Contanti\n"<< "3= Saldo Attuale
\n"<<
		"\nFai la tua scelta!\n" << endl;
	cin >> scelta;
	if (scelta == 1)
	{
		cout << "Inserisci l'importo che vuoi versare!\n" << endl;
		cin >> importo;
		movimenti.credit(importo);
		cout << "\nIl saldo attuale dopo questa operazione è: \n"<<
movimenti.getBalance()
			<< endl;
	}
	if (scelta == 2)
	{
	cout << "Quanto vuoi ritirare ?\n";
	cin >> importo_d;
	movimenti.debit(importo_d);
	cout << "\nTransazione completata!\n"<< endl <<"Saldo Attuale: \n" <<
movimenti.getBalance();
	}
	if (scelta == 3)
		cout << "\nIl saldo attuale è: " << movimenti.getBalance()<< endl <<
endl;


 	if (i=0)
if (i==0)
E.


Ciao, si...avevo trovato questo errore(molto subdolo); teoricamente
avrei risolto l'esercizio, ma mi rimangono due domande:
1) L'esercizio diceva di creare due oggetti per testare le funzioni
membro...non riesco a pensare a nessun altro oggetto però...
2) Dato che ho separato l'interfaccia dall'implementazione...non
dovrei riuscire a compilare il sorgente con l'header...senza il
main ???...ho capito male???
Grazie in anticipo!
Alex

 main ???...ho capito male???
Puoi compilare i due .cpp separatamente. Gli header *.h non vanno compilati.
E.


Per capirci, dato che il libro è un pò evasivo su questo:
1) Creo il sorgente della classe, creo l'header, creo il il .cpp con
dentro il main
2) A questo punto compilo il .cpp della classe
3) Compilo il .cpp con il main....in questo modo dovrei aver
"nascosto" l'implementazione della classe?
E' corretto ?
Alex

 E' corretto ?
Sě. Non importa l'ordine in cui fai le compilazioni. E alla fine devi 
linkare il codice compilato.
E.