Newsgroup: it.comp.lang.c++
Titolo: I modelli di classe funzionano?

Egregi Signori, vorrei porvi a tutti una questione secondo me
gravissima: mi
pare che le classi template non funzionino affatto in presenza di cicli
iteratori.
Non so perché, dato che sono solo uno studente, ma ho cambiato
compilatore
e letto piů libri ottenendo lo stesso risultato. Vi pongo il seguente
codice che
implementa un vettore di interi. Succede che pur essendo corretti i
numeri
inseriti nel vettore (cosě si possono vedere  se estratti singolarmente)
non
vengono estratti correttamente se visualizzati con un ciclo for.
Vi prego di aiutarmi a capire se il problema č concettuale, perché ho
bisogno
di una soluzione. Grazie a tutti.
//---------------------------------------------------------------------------
#include <iostream.h>
//---------------------------------------------------------------------------
template <class T> class Vettore
{
    T* data;
    int size;
    public:
    Vettore(int);
    ~Vettore(){delete data;}
    T& operator[](int i);
};
template <class T>
 Vettore<T>::Vettore(int n):size(n)
{
 data=new T(n);
};
template <class T>
 T& Vettore<T>::operator[](int i)
{
 return data[i];
};
int main()
{
    int i=0;
    Vettore<int> x(5);
    for(i=0; i<5;++i)            //metto dei numeri nel vettore.
         x[i]=i;
    for(i=0; i<5;++i)
         cout<<x[i]<<endl;    //vedo dei numeri casuali dalla posizione
2 in poi.
    return 0;
}
//---------------------------------------------------------------------------
Marco Dongu  
md...@tin.it

 data=new T(n);
Qui non stai allocando un vettore di n oggetti di tipo T inizializzati
con il loro ctor di default, bensi` un singolo oggetto di tipo T, che
e` inizializzato con l'intero n.  Questo significano quelle parentesi
tonde che hai usato.  Scrivi invece:
    data = new T[n];
con le parentesi, nota bene, quadre, e tutto funzionera`.
Meglio ancora: usa un bel..:
#include <vector>
(se hai un compilatore C++ a standard, tipo VC++ 5.0, Borland
C++ Builder 3, GCC decentemente recente [basta 2.7.2...!],
ecc ecc), e usa il potente, veloce, debuggato vector<T> della
STL, invece di doverti reinventare, reottimizzare, e redebuggare
il tuo personale vettore...
Alex

>};
 


A prima vista sembrava impossibile che non 
funzionasse, ma poi è stato chiarissimo : le parentesi sono tonde 
!!


 


data = new 
T(n);


 


data NON è un vettore di n elementi di 
tipo T, ma un puntatore ad un solo elemeto che viene creato chiamando un 
costruttore che accetta un int come parametro.


Se provi a passare come parametro del template 
un tipo che dispone di un simile costruttore, il codice non ti viene 
compilato.
 


 


Avresti dovuto semplicemente scrivere 
:


 


data = new 
T[n];


 


In questo caso T deve disporre 
di un costruttore di default.


 


 


Andrea Murru
-> 
amu...@tin.it
 
<-
http://www.pegacity.it/informatica/case/473/index.htm



};
per costruire un vettore di n elementi devi usare le parentesi quadre
data=new T[n];
Come hai scritto tu crei un elemento del tipo T e lo inizializzi con n
___
Fabio Forno
"Vi aspetta l'esplorazione delle ignote possibilita' 
dell'esistenza" - Q in "All Good Things..."
=============================================
scia...@inorbit.com
http://rampage.ml.org/sector1/~sciasbat/