Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte
Abbiamo provato le nuove CPU Intel Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: più core e ottimizzazioni al funzionamento interno migliorano le prestazioni, anche in virtù di prezzi annunciati interessanti. A questo si aggiungono nuove ottimizzazioni software. Purtroppo, a fronte di prestazioni di calcolo elevate, il quadro rimane incerto nel gaming, dove l'andamento rimane altalenante. Infine, rimane il problema della piattaforma a fine vita.
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
Il modello "build to order" di PCSpecialist permette di selezionare una struttura base per un sistema, personalizzandolo in base alle specifiche esigenze con una notevole flessibilità di scelta tra i componenti. Il modello Lafité 14 AI AMD è un classico notebook clamshell compatto e potente, capace di assicurare una elevata autonomia di funzionamento anche lontano dalla presa di corrente
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Nothing con il suo nuovo Phone 4(a) conferma la sua identità visiva puntando su una costruzione che nobilita il policarbonato. La trasparenza resta l'elemento cardine, arricchita da una simmetria interna curata nei minimi dettagli. Il sistema Glyph si evolve, riducendosi nelle dimensioni ma aumentando l'utilità quotidiana grazie a nuove funzioni software integrate e notifiche visive. Ecco tutti i dettagli nella recensione completa
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


Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
HP Imagine 2026: dalle workstation con c...
HP IQ: 20 miliardi di parametri sul PC, ...
Claude Code, il piano Max brucia la quot...
Scoperto un secondo esopianeta nel giova...
Account inaccessibili su Windows 11: Mic...
OpenAI punta sull'energia da fusione: tr...
Apple lavora su un sensore domestico con...
Ecco come Microsoft sta frenando (per or...
Le batterie allo stato solido funzionano...
"Aurion - La prima luce": il p...
Niente più Account Microsoft su W...
Philips abbandona Google TV: arriva Tita...
Face ID per accedere a Reddit? Huffman c...
AMD rilascia FSR SDK 2.2: Upscaling 4.1 ...
Gli Stati Uniti vietano i router stranie...
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: 14:46.


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