|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jan 2009
Messaggi: 50
|
[C++] overload di operatori
Salve a tutti, volevo sapere se c'è qualcuno che può aiutarmi con questo problema:
sto scrivendo un programma in c++ in cui ho definito alcune classi e ho fatto l'overload degli operatori << e >> per gli oggetti relativi a queste classi, ma quando compilo mi da errore: qui vi posto un pezzo del codice: class data {public: int G; int M; int A; data(); void stampa(ostream& dest) {dest<<G<<"/"<<M<<"/"<<A; return; } void leggi(istream& sorg) {int giorno,mese,anno; char sep='/'; sorg>>giorno>>sep>>mese>>sep>>anno; G=giorno; M=mese; A=anno; return; } } class persona : public data {public: string NOME; string COGNOME; data NASCITA; string RECAPITO; string MAIL; persona(); void stampa(ostream& dest) {dest<<COGNOME<<endl<<NOME<<endl; dest<<NASCITA; dest<<endl<<RECAPITO<<endl<<MAIL<<endl<<endl; return; } void leggi(istream& sorg) {string name,surname,address,email; data birth; sorg>>name>>surname; sorg>>birth; sorg>>address>>email; NOME=name; COGNOME=surname; NASCITA=birth; RECAPITO=address; MAIL=email; return; } } //altre classi e robe varie... //poi fuori dalla definizione di qualsiasi classe e prima di aprire il main ho scritto: ostream& operator<<(ostream& dest,const data& x) {x.stampa(dest); return dest; } istream& operator>>(istream& sorg,data& x) {x.leggi(sorg); return sorg; } ostream& operator<<(ostream& dest,const persona& x) {x.stampa(dest); return dest; } istream& operator>>(istream& sorg,persona& x) {x.leggi(sorg); return sorg; } a compile time mi da quest'errore: no match for 'operator<<' in 'dest <<((persona)*this)->persona::NASCITA' perchè??? Come devo fare per risolvere questo problema?? grazie in anticipo a chi risponde!!!! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
La prossima volta intenda il codice, altrimenti non ci si capisce niente.
Codice:
class data
{
public:
int G;
int M;
int A;
data();
void stampa(ostream& dest)
{
dest<<G<<"/"<<M<<"/"<<A;
return;
}
void leggi(istream& sorg)
{
int giorno,mese,anno;
char sep='/';
sorg>>giorno>>sep>>mese>>sep>>anno;
G=giorno;
M=mese;
A=anno;
return;
}
}
class persona : public data
{
public:
string NOME;
string COGNOME;
data NASCITA;
string RECAPITO;
string MAIL;
persona();
void stampa(ostream& dest)
{
dest<<COGNOME<<endl<<NOME<<endl;
dest<<NASCITA;
dest<<endl<<RECAPITO<<endl<<MAIL<<endl<<endl;
return;
}
void leggi(istream& sorg)
{
string name,surname,address,email;
data birth;
sorg>>name>>surname;
sorg>>birth;
sorg>>address>>email;
NOME=name;
COGNOME=surname;
NASCITA=birth;
RECAPITO=address;
MAIL=email;
return;
}
}
//altre classi e robe varie...
//poi fuori dalla definizione di qualsiasi classe e prima di aprire il main ho scritto:
ostream& operator<<(ostream& dest,const data& x)
{
x.stampa(dest);
return dest;
}
istream& operator>>(istream& sorg,data& x)
{
x.leggi(sorg);
return sorg;
}
ostream& operator<<(ostream& dest,const persona& x)
{
x.stampa(dest);
return dest;
}
istream& operator>>(istream& sorg,persona& x)
{
x.leggi(sorg);
return sorg;
}
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jan 2009
Messaggi: 50
|
ok, hai ragione...
l'errore è relativo a questa riga della classe "persona", nella funzione "stampa": Codice:
dest<<NASCITA; |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sposta quegli operatori << prima della definizione delle classi.
Inoltre è buon uso non usare mai variabili membro maiuscolo. Per la lettura del codice ti consiglio anche di mettere uno spazio fra operatori e argomenti. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Jan 2009
Messaggi: 50
|
eh ho già provato a spostarli..
se li metto tra la classe "data" e quella "persona", continua a darmi l'errore precedente e in più, riferito alla riga: Codice:
ostream& operator<<(ostream& dest,const data& x) expected initializer before '&' token Se invece li sposto tutti prima delle definizioni di tutte le classi mi da 8 errori in più rispetto a prima, tra cui: expected ',' or '...' before '&' token e ISO C++ forbids declaration of 'data' with no type e 'x' was not declared in this scope e ambiguous overload for operator << (questo ritorna parecchie volte...) Ultima modifica di stufava : 23-01-2009 alle 17:26. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Prima di tutto ti manca il ; dopo la parentesi chiusa di ogni classe.
A questo punto devi mettere il prototipo degli operatori sopra la dichiarazione delle classi e devi fare una "forward declaration" delle classi. La forward declaration è una tecnica che permette di risolvere i casi in cui un simbolo viene usato prima della sua implementazione o dichiarazione. In questo caso infatti se sposti gli operatori sotto risulta non definito l'operatore, se li sposti sopra risultano non definite le classi. Per fare una forward declaration ti basta mettere: class data; class persona; prima del prototipo degli operatori. |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Jan 2009
Messaggi: 50
|
beh innanzitutto grazie per l'aiuto e per la pazienza..
ho fatto come mi hai detto e così adesso la parte iniziale del codice è questa: Codice:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
class data;
class persona;
ostream& operator<<(ostream& dest,const data& x)
{x.stampa(dest);
return dest;
};
istream& operator>>(istream& sorg,data& x)
{x.leggi(sorg);
return sorg;
};
Adesso il compilatore non mi da più gli errori di prima, ma, riferito all'overload di <<: 1) invalid use of undefined type 'const struct data' 2)forward declaration of 'const struct data' e uguale riferito all'overload di >>, ma con 'struct data'. se tolgo il const dal parametro 'data' di << non cambia nulla, mentre se tolgo il '&' dallo stesso parametro oltre ai precedenti errori mi da anche: 'x' has incomplete type quindi, questo benedetto parametro, come lo devo inserire?? Scusa l'insistenza e grazie ancora... |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No, prima delle classi devi spostare solo il prototipo delle funzioni, l'implementazione la devi lasciare sotto le classi (altrimenti non ti trova i metodi che richiami visto che la forward declaration non dichiara alcun metodo). Cioè questi:
ostream& operator<<(ostream& dest,const data& x); istream& operator>>(istream& sorg,data& x); ostream& operator<<(ostream& dest,const persona& x); istream& operator>>(istream& sorg,persona& x); Nota che tutto si sarebbe risolto se avessi dichiarato lo classe prima dell'implementazione Ti sei dimenticato di implementare i costruttori. |
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Jan 2009
Messaggi: 50
|
grazie!! Adesso ho capito come devo fare...
solo un'ultima cosa: poi magari lo sistemo un po' meglio, ma implementato così, quando faccio 'build', il compilatore mi da: process terminated with status 1 (0 minutes, 1 seconds) 0 errors, 0 warnings evidenziato in rosso... qualcosa mi dice che non è un bellissimo segnale... |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Fai uno screenshot...
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Jan 2009
Messaggi: 50
|
eccolo.. ti ho messo solo l'errore perchè lo screenshot di tutto lo schermo pesava troppo...
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Allora mi immagino che tu sia su Vista e stia usando Code::Blocks. Mi sa che è quello il famoso errore di cui tutti si lamentano
Installa Code::Blocks al posto di Dev-C++ (progetto vecchio e buggato all'inverosimile). http://www.codeblocks.org/downloads/5 codeblocks-8.02mingw-setup.exe |
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Jan 2009
Messaggi: 50
|
d'oh!! Io ho installato code::blocks 8.02, compilatore MinGW e ho Windows XP!!
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#15 |
|
Member
Iscritto dal: Jan 2009
Messaggi: 50
|
allora mi succede una cosa un po' strana, adesso cerco di spiegartela..
facendo 'build' come ti ho detto mi dava quell'errore e se poi facevo 'run' mi faceva partire un programmino di prova che avevo fatto appena avevo scaricato code::blocks; cioè una cosa che non c'entrava assolutamente nulla con questo programma. Allora adesso ho cancellato l'intera cartella programmazione che ho sul desktop e in cui salvo tutti i file .c .o .exe relativi a code::blocks e l'ho ricreata, salvandoci solo il codice di questo programma. In questa cartella adesso c'è solo progetto.c Adesso se faccio 'build' mi da lo stesso errore di prima, mentre se provo a fare 'run' mi esce questo messaggio: Codice HTML:
it seems that this file has not been built yet. Do you want to build it now? "process returned 0" |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ricordati che devi creare un nuovo progetto per ogni programma.
|
|
|
|
|
|
#17 |
|
Member
Iscritto dal: Jan 2009
Messaggi: 50
|
cioè devo fare "new project"?
Scusami come avrai capito sono decisamente un principiante, ma devo fare questo programma per un esame di programmazione e fino ad ora ho sempre e solo creato "empty file" (e salvando mi crea il file.c), poi facevo "build" (file.o) e "run" (file.exe) (se non sbaglio)... |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Certo, New -> Project -> Console Application -> Ok -> scegli C++ -> inserisic il nome del progetto ed il percorso -> vaia vanti fino in fondo.
|
|
|
|
|
|
#19 |
|
Member
Iscritto dal: Jan 2009
Messaggi: 50
|
fatto.. dopo devo inserire il codice del programma nella cartella del progetto?
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No, ti dovrebbe aver creato un file .cpp già inserito nel progetto, giusto ? Inserisci dentro quel file il tuo codice.
Se vuoi inserire un file già esistente nel progetto, seleziona il nome del progetto (sulla sinistra sotto a workspace), tasto destro sopra il nome del progetto, aggiungi un file, selezioni il nome del file (meglio metterlo nella directory del progetto). Se invece vuoi creare un nuovo file da inserire nel progetto: File -> New -> File, selezioni il tipo di file -> per inserire il nome del file clicki sul pulsante accanto al nome del file, immetti il nome, ok e poi selezioni All (Debug e Release sono due le due configurazioni attive per il progetto, una ti permette di eseguire il debug dell'applicazione, l'altra è ottimizzata per la distribuzione dell'eseguibile finale). |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:46.




















