Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Il nuovo top di gamma vivo punta su un comparto fotografico particolarmente articolato, con un teleobiettivo da 200 megapixel e teleconvertitori esterni capaci di arrivare a 400 mm equivalenti. Lo abbiamo provato a Tenerife, mettendo alla prova fotocamere, prestazioni, autonomia e accessori. Ecco come si è comportato.
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-01-2009, 15:25   #1
stufava
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!!!!
stufava è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2009, 15:45   #2
cionci
Senior Member
 
L'Avatar di cionci
 
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;
}
Manca la parte di codice in cui avviene l'errore, è impossibile capirne il motivo
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2009, 15:56   #3
stufava
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;
stufava è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2009, 16:02   #4
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2009, 17:20   #5
stufava
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)
mi da questo errore:

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.
stufava è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2009, 18:31   #6
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2009, 19:09   #7
stufava
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;
            };
e successivamente inziano le definizioni delle classi data e persona che ho già postato.
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...
stufava è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2009, 19:15   #8
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2009, 19:55   #9
stufava
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...
stufava è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2009, 19:58   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Fai uno screenshot...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2009, 23:57   #11
stufava
Member
 
Iscritto dal: Jan 2009
Messaggi: 50
eccolo.. ti ho messo solo l'errore perchè lo screenshot di tutto lo schermo pesava troppo...
Immagini allegate
File Type: bmp Immagine1.bmp (17.6 KB, 14 visite)
stufava è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2009, 10:36   #12
cionci
Senior Member
 
L'Avatar di cionci
 
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
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2009, 10:49   #13
stufava
Member
 
Iscritto dal: Jan 2009
Messaggi: 50
d'oh!! Io ho installato code::blocks 8.02, compilatore MinGW e ho Windows XP!!
stufava è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2009, 11:01   #14
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da stufava Guarda i messaggi
d'oh!! Io ho installato code::blocks 8.02, compilatore MinGW e ho Windows XP!!
Scusa, nella prima frase mi riferivo a Dev-C++, ma hos critto code::blocks
In effetti è strano che non ti funzioni.

Ma se premi il tasto "Play" non ti esegue il tuo programma ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2009, 11:19   #15
stufava
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?
Se faccio sì siamo da capo. Se invece faccio no mi si apre un eseguibile già terminato, cioè la classica finestra del programma con scritto
"process returned 0"

stufava è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2009, 11:35   #16
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2009, 11:56   #17
stufava
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)...
stufava è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2009, 12:00   #18
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2009, 12:13   #19
stufava
Member
 
Iscritto dal: Jan 2009
Messaggi: 50
fatto.. dopo devo inserire il codice del programma nella cartella del progetto?
stufava è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2009, 12:32   #20
cionci
Senior Member
 
L'Avatar di cionci
 
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).
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
La sonda spaziale NASA Lucy ha raggiunto...
Le GeForce RTX 5000 scarseggiano, tornan...
Raspberry Pi 5, il prezzo è ormai...
I frigoriferi dei supermercati diventano...
Le vecchie fotocamere digitali compatte ...
La Cina potrebbe rinviare il ritorno del...
Verizon non è preoccupata della c...
RDNA 5 sulle APU AMD, ma non per tutti: ...
Marvell acquisisce Lumentum per 115 mili...
La febbre dei data center fa impennare i...
ECOVACS T90S OMNI crolla a 499€ su Amazo...
In Cina i camion elettrici hanno gi&agra...
Attacchi hacker ai supermercati in Europ...
I datacenter non piacciono? OpenAI prova...
Cupra Raval sfida BMW, Volvo e le altre:...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:29.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v