|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
[C++]Problema operator[]
Ho questo overloading:
Codice:
//altro /////////////////////////////// // Overloading /////////////////////////////// int &operator[](int index); //altro Codice:
/** Overloading del subscript */ int &Vettore::operator[]( int index ) { if( (index <= dimensione) && (index > 0) ) return elementi[index]; } .......perche? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
|
non capisco il & a che ti serve... (e non so neanche se si può fare)
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Qaule errore ti ha dato ?
|
![]() |
![]() |
![]() |
#4 | |
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
Quote:
Compilatore: Default compiler Building Makefile: "C:\Progetti\Vettore\Makefile.win" Esecuzione di make... make.exe -f "C:\Progetti\Vettore\Makefile.win" all g++.exe -c Src/Vettore.cpp -o Src/Vettore.o -I"C:/Dev-Cpp/include/c++" -I"C:/Dev-Cpp/include/c++/mingw32" -I"C:/Dev-Cpp/include/c++/backward" -I"C:/Dev-Cpp/include" Src/Vettore.cpp:142: syntax error before `::' token make.exe: *** [Src/Vettore.o] Error 1 Esecuzione terminata |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non è che l'errore è in qualche linea precedente ?
|
![]() |
![]() |
![]() |
#6 | |
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
Non so se centri,ma in genere non si usa int per l'indice ma
unsigned int. Probabilmente se la classe fa rifarimento ad un array è questo l'errore. Se no potresti scrivere array[-3] non ti pare? Può darsi che mi sbagli. Poi: perchè index > 0 ? Prova. |
![]() |
![]() |
![]() |
#8 | |
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
Quote:
|
|
![]() |
![]() |
![]() |
#9 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Re: [C++]Problema operator[]
Quote:
Dovresti avere i sorgenti organizzati piu' o meno cosi': Codice:
// Vettore.h #ifndef VETTORE_H #define VETTORE_H class Vettore{ /* ... */ int& operator[](unsigned int); }; /*...*/ #endif Codice:
// Vettore.cpp #include "Vettore.h" int& Vettore::operator[](unsigned int x){ /*...*/ } |
|
![]() |
![]() |
![]() |
#10 |
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
mi da sempre lo stesso errore
![]() ![]() |
![]() |
![]() |
![]() |
#11 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Ah... trovato un errore intanto: se l'indice non e' compreso nell'intervallo, che ritorni ? Dovresti lanciare un'eccezione, ad esempio
Codice:
struct Error {} ; int& Vector::operator[]( int n ) { if ( n < 0 || n >= dimensione ) throw Error(); return elementi[index]; } se ancora non va (probabilmente no visto che l'errore era segnalato prima ) prova a postare tutto il file cpp allora.. |
![]() |
![]() |
![]() |
#12 |
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
Codice:
// Vettore.h: interface for the Vettore class. #ifndef VETTORE_H #define VETTORE_H #include <cstring> #include <cstdio> template<class T> /** La classe del vettore */ class Vettore { public: /////////////////////////////// // Costruttori/distruttori /////////////////////////////// Vettore(int dim=10); ~Vettore(); /////////////////////////////// // Utilita di ricerca /////////////////////////////// void Ordina(); int cerca(T key); /////////////////////////////// // Funzioni di interfaccia /////////////////////////////// int getDimensione(); T getElemento(int pos); void Stampa();// TODO /////////////////////////////// // Funzioni vettore /////////////////////////////// void AggiungiElemento(T elemento, int pos); void AggiungiElemento(T elemento); void RimuoviElemento(int pos); void Ridimensiona(int new_dim); void Svuota(); /////////////////////////////// // Overloading /////////////////////////////// int& operator[](unsigned int); private: T* elementi; // gli elementi int dimensione; // la dimensione }; #endif Codice:
// Vettore.cpp #include "Vettore.h" #include <cstring> #include <string> #include <cmath> /** Construttore standard(1 arg) */ template<class T> Vettore<T>::Vettore(int dim) { dimensione = dim; elementi = new T[dimensione]; for(int i=0;i<dimensione;i++) { elementi[i] = NULL; } } /** Distruttore standard */ template<class T> Vettore<T>::~Vettore() { delete[] elementi; } /** Restituisce la dimensione */ template<class T> int Vettore<T>::getDimensione() { return dimensione; } /** Ordina gli elementi */ template<class T> void Vettore<T>::Ordina() { bool is_sorted=false; int p=0,q=0; T tmp;// la variabile temporanea di appoggio while(!is_sorted){ is_sorted=true; ++p;// p viene avanzato e poi visualizzato for(q=0;q<dimensione-p;++q){ if(elementi[q]>elementi[q+1]) { tmp=elementi[q]; elementi[q]=elementi[q+1]; elementi[q+1]=tmp; is_sorted=false;// esce dal for } } } } /** Ricerca elementi */ template<class T> int Vettore<T>::cerca(T key) { for(int i=0;i<dimensione;i++) { if(elementi[i] == key) return i; } return -1; } /** Aggiunge un elemento (con posizione specificata) */ template<class T> void Vettore<T>::AggiungiElemento(T elemento, int pos) { if( (pos < dimensione) && (pos >= 0) ) elementi[pos] = elemento; } /** Aggiunge un elemento (senza posizione specificata) */ template<class T> void Vettore<T>::AggiungiElemento(T elemento) { for(int pass=0;pass<dimensione;pass++) { if(elementi[pass] == NULL) elementi[pass] = elemento; break; // esce dal for } } /** Restituisce un elemento (posizione specificata) */ template<class T> T Vettore<T>::getElemento(int pos) { return elementi[pos]; } /** Rimuove un elemento (con posizione specificata) */ template<class T> void Vettore<T>::RimuoviElemento(int pos) { if( (pos < dimensione) && (pos >= 0) ) elementi[pos] = NULL; } /** Ridimensiona l'array */ template<class T> void Vettore<T>::Ridimensiona(int new_dim) { T *tmp = new T[new_dim]; for(int j=0;j<getDimensione();j++) { tmp[j] = elementi[j]; } dimensione = new_dim; elementi = tmp; } /** Svuota e reimposta a 0 tutti gli elementi */ template<class T> void Vettore<T>::Svuota() { } /** Overloading del subscript */ int& Vettore::operator[](unsigned int x) { if( (index <= dimensione) ) return elementi[index]; } |
![]() |
![]() |
![]() |
#13 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
aaah, ma e' un template...
allora hai dimenticato il <T> (e devi ritornare un T) template <class T> T& Vettore<T>::operator[]( int n ) { /*...*/ } |
![]() |
![]() |
![]() |
#14 | |
Bannato
Iscritto dal: Nov 2002
Città: PV
Messaggi: 1210
|
Quote:
Cazzo................faccio pena ![]() |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
Stavo appunto per drirgli che solitamente una classe array
si fa con un template... come non detto ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:56.