Newsgroup: it.comp.lang.c++
Titolo: Aiuto: Classi e memoria dinamica

Un saluto a tutto l'NG,
sono 2 settimane che studio il C++ e sono arrivato a dover scrivere
programmi che utilizzano le class.
Il mio problema e' il seguente:
ho definito una classe,
ora io voglio allocare memoria dinamicamente per poter avere un vettore di
classi, come posso fare ?
come posso accedere ad un elemento del vettore ?
Se questo non e' possibili quale altra alternativa posso utilizzare ?
Un ringraziamento anticipato.

come posso accedere ad un elemento del vettore ?
Ammettiamo che la classe sia:
class NomeClasse
{ /* dati e metodi */
}
Ora dipende cosa vuoi fare:
1) Se vuoi un array di puntatori per poter allocare dinamicamente ogni
oggetto devi fare cosě (ammettiamo di 10 elementi):
main()
{  NomeClasse *pNC[10];
   int i;
   for (i=0;i<10;i++) pNC[i]=new NomeClasse;
   /* utilizzo di esempio di un metodo:*/
   pNC->Metodo();
   /* Ora devi deallocare gli oggetti */
   for (i=0;i<10;i++) delete pNC[i];
}
2) Se invece vuoi un array di classi allocato dinamicamente devi fare cosě:
main()
{  NomeClasse *pNC;
   pNC=new NomeClasse[10];
   /* e per accedere ad un metodo... */
   (pNC+3)->Metodo(); /* Cosě accedi al quarto elemento */
   /* oppure */
   *(pNC+3).Metodo(); /* Sempre il quarto elemento pNC č il primo, pNC + 1 č
il secondo e cosě via... */
   /* prima di uscire deallochiamo la memoria... */
   delete pNC;
}
Spero gli esempi siano corretti, se no qualcuno me lo dica...
Ciao, Henrik.

}
delete[] pNC;
Per la cronaca esiste la possibilita` di allocare staticamente un array di oggetti:
NomeClasse[10] = { X0... X9 };
gli X0... X9 sono i valori cuin inizializzare le istanze, se ommessi viene
utilizzato il default ctor.
Paolo
----------------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
----------------------------------------------------------

    delete pNC;
delete [] pNC;
EMG

classi, come posso fare ?
Oltre a quanto illustrato negli altri replies, puoi usare
i containers della libreria standard senza dover armeggiare
in prima persona con i puntatori.
Ecco un esempio:
---
#include <iostream>
#include <vector>
#include <algorithm>
using std::vector;
class TMyClass
{
private:
  int _avalue;
protected:
public:
  //ctors and dtor
  TMyClass(){_avalue=0;}
  TMyClass(int Vavalue){_avalue=Vavalue;}
  TMyClass(const TMyClass& VMyClass){_avalue=VMyClass._avalue;}
  ~TMyClass(){}
  //Public methods
  int avalue(){return _avalue;}
  void avalue(int Vavalue){_avalue=Vavalue;}
  //operators
  TMyClass& operator=(const TMyClass& c)
  {
    _avalue=c._avalue;
    return (*this);
  }
 
  int operator==(const TMyClass& c)const
  {
     return (_avalue==c._avalue);
  }
  friend ostream& operator << (ostream& os, const TMyClass& c);
};
ostream& operator <<(ostream &os, const TMyClass& c)
{
  os<<c._avalue;
  return os;
}
typedef vector<TMyClass> TMyClasses;
int main()
{
//Costruiamo riempiamo l'array di oggetti  
 
  TMyClasses MyClasses;
  for(int i=0; i<10; i++)
  {
    TMyClass MyClass(i);
    MyClasses.push_back(MyClass);
  }
//Stampiamo il contenuto del membro privato avalue
//di ogni classe
//Metodo1: usando il metodo pubblico int avalue()
  vector<TMyClass>::iterator c_it, c_end_it;
  c_it=MyClasses.begin();
  c_end_it=MyClasses.end();
  cout<<"Metodo 1"<<endl;
  while(c_it!=c_end_it)
  {
    cout<<c_it->avalue()<<endl;
    c_it++;
  }
  cout<<"\n\n"<<endl;
//Metodo2: usando la funzione copy
 
  cout<<"Matodo 2"<<endl;
  copy(MyClasses.begin(), MyClasses.end(), 
         ostream_iterator<TMyClass>(cout, "\n"));
 
  return 0;
}
-- 
Roberto Gerola
Email: 
roge...@tin.it
WWW: 
http://space.tin.it/computer/rgerola

}
delete[] pNC;
Paolo


using std::vector;
Oops, mi sono dimenticato:
using std::cout;