Newsgroup: it.comp.lang.c++
Titolo: [?] array dinamici di oggetti

Salve.
Sto imparando a programmare in C++, usando Visual C++ 6 su winxp.
Adesso però sono di fronte a un problema che non riesco proprio a
risolvere. Siccome non sono nemmeno sicuro sulla parte del codice
incriminata posterò il listato completo del programma alla fine del
messaggio. In ogni caso si blocca sulla function printResults().
Eseguendo il debug mi ha portato su una riga di un listato esterno
dove il programma si blocca. Saltando quella precisa istruzione il
programma funziona. Grazie anticipatamente.
Ecco il codice completo:
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
class Account
	{
	public:
		Account(string anome, double saldo_iniziale);
		Account(string anome);
		void deposito(double importo);
		void prelievo(double importo);
		void transfer(double importo, Account& trTO);
		void print_balances() const;
		double interessi(double perc, int anni);
	private:
		double saldo;
		string nome;
	};
Account::Account(string anome, double saldo_iniziale)
	{
	nome = anome;
	saldo = saldo_iniziale;
	}
Account::Account(string anome)
	{
	nome = anome;
	saldo = 0;
	}
void Account::deposito(double importo)
	{
	saldo += importo;
	}
void Account::prelievo(double importo)
	{
	if (saldo < importo)
		{
		cout << "L'importo scelto è superiore al saldo del
conto.\n" <<
			"Verranno sottratti 5 euro come penale.\n";
		saldo -= 5;
		if (saldo < 0) saldo = 0;
		}
	else
		saldo -= importo;
	}
void Account::transfer(double importo, Account& trTO)
	{
	if (saldo < importo)
		cout << "L'importo scelto è superiore al saldo del
conto.\n" <<
			"Verranno sottratti 5 euro come penale.\n";
		saldo -= 5;
		if (saldo < 0) saldo = 0;
	else 
		{
		trTO.deposito(importo);
		prelievo(importo);
		}
	}
void Account::print_balances() const
	{
	cout << nome << " - " << saldo << "\n";
	}
double Account::interessi(double perc, int anni)
	{
	double result;
	result = saldo * pow (perc / 100, anni);
	saldo += result;
	return result;
	}
Account *conti; //crea un array dinamico
int conti_size = 0;
void printResults()   //Account conti[], int conti_size)
	{
	int i = 0;
	while (i != (conti_size))
		{
		cout << i + 1 << ". ";
		conti[i].print_balances();
		i++;
		}
	}
int scegliConto()   //int conti_size)
	{
	int scelta;
SCELTA:
	cout << "Scegliere il conto corrente: ";
	cin >> scelta;
	if (cin.fail()) return -1;
	scelta--;
	if (scelta > conti_size || scelta < 0)
		{
		cout << "Numero di conto errato.\n";
		goto SCELTA;
		}
	return scelta;
	}
bool operazioni()
	{
 
	int conto1;
	int conto2;
	double importo;
	string operaz;
 
	//OPERAZIONI TRA I CONTI
	cout << "Riepilogo dei conti corrente:\n";
	printResults();  //conti,conti_size);
DOMANDA:
	cout << "Quali operazioni si desidera eseguire (PR =
prelevamento,\n" <<
		"DE = deposito, TR = trasferimento fondi, FI =
Fine)?";
	cin >> operaz;
	if (operaz == "PR")
		// PRELEVAMENTO
		{
		conto1 = scegliConto();  //conti_size);
		if (conto1 == -1)
			{
			cout << "Errore durante lo stream di
input.\n";
			return 1;
			}
		cout << "Indicare importo: ";
		cin >> importo;
		if (cin.fail())
			{
			cout << "Errore durante lo stream di
input.\n";
			return 1;
			}
		conti[conto1].prelievo(importo);
		}
	else
		{
		if (operaz == "DE")
			// DEPOSITO
			{
			conto1 = scegliConto();   //conti_size);
			if (conto1 == -1)
				{
				cout << "Errore durante lo stream di
input.\n";
				return 1;
				}
			cout << "Indicare importo: ";
			cin >> importo;
			if (cin.fail())
				{
				cout << "Errore durante lo stream di
input.\n";
				return 1;
				}
			conti[conto1].deposito(importo);
			}
		else
			{
			if (operaz == "TR")
				// TRASFERIMENTO FONDI
				{
				conto1 = scegliConto();
//conti_size);
				if (conto1 == -1)
					{
					cout << "Errore durante lo
stream di input.\n";
					return 1;
					}
				conto2 = scegliConto();
//conti_size);
				if (conto2 == -1)
					{
					cout << "Errore durante lo
stream di input.\n";
					return 1;
					}
				cout << "Indicare importo: ";
				cin >> importo;
				if (cin.fail())
					{
					cout << "Errore durante lo
stream di input.\n";
					return 1;
					}
				conti[conto1].transfer(importo,
conti[conto2]);
				}
			else
				{
				if (operaz=="FI")
					{
					return false;
					}
				else
					{
					// SCELTA NON CORRETTA
					cout << "Scelta non correta.
Scegliere tra le opzioni indicate.\n";
					goto DOMANDA;
					}
				}
			}
		}
	return true;
	}
int main()
	{
	int i = 0;
	double tempsaldo;
	string tempnome;
	string operaz;
	//STAMPA TITOLO
	cout << "*********************** BANCA
***********************\n";
	cout <<
"*****************************************************\n\n";
	//RICHIESTA DEI DATI INIZIALI
 
	cout << "Inserire il numero di conti corrente: ";
	cin >> conti_size;
	if (cin.fail())
		{
		cout << "Errore durante lo stream di input.\n";
		return 1;
		}
	conti = new Account("");
	while (i != (conti_size))
		{
		cout << "Inserire nome del conto corrente numero " <<
i + 1 << ":";
		cin >> tempnome;
		cout << "Inserire il saldo iniziale del conto corrente
numero " << i + 1 << ":";
		cin >> tempsaldo;
		if (cin.fail())
			{
			cout << "Errore durante lo stream di
input.\n";
			return 1;
			}
		conti[i] = *new Account(tempnome, tempsaldo);
		i++;
		}
 
	while(operazioni());
	cout << "Si desidera calcolare l'interesse dei conti corrente
(S\\N)? ";
	cin >> operaz;
	if (operaz=="S")
		{
		// CALCOLO INTERESSE
		i = 0;
		double tasso;
		int anni;
		cout << "Indicare il numero di anni: ";
		cin >> anni;
		if (cin.fail())
			{
			cout << "Errore durante lo stream di
input.\n";
			return 1;
			}
		while (i < conti_size)
			{
			cout << "Indicare tasso di interesse (0 se
nullo) per il conto:\n";
			conti[i].print_balances();
			cin >> tasso;
			if (cin.fail())
				{
				cout << "Errore durante lo stream di
input.\n";
				return 1;
				}
			conti[i].interessi(tasso, anni);
			i++;
			}
		}
	return 0;
	}

 		conti[i] = *new Account(tempnome, tempsaldo);
E qui viene usato come se puntasse ad un array. Ogni oprazione su
conti[i] con i != 0 provoca undefined behaviour.
Anche se conti fosse un array, ci sarebbe un altro problema: ad ogni
iterazione del ciclo viene creato in nuovo Account, copiato
nell'"array", e abbandonato nello heap. Non avendo piu` nessun
riferimento al nuovo Account non e` possibile usare delete per
distruggerlo e liberare la memoria.
Se ti serve un contenitore per un numero variabile di Account, usa un
contenitore della libreria standard, come vector o deque.
        Mauro



grazie 1000.
ora vado a documentarmi su vector.
se non ti dispiace potresti comunque postare la versione completa e
corretta del mio codice ma usando gli array dinamici anzichč un
contenitore come vector?