View Full Version : Overloading Operatori
friend ostream &operator << (ostream &out, Person &Record);
friend istream &operator >> (istream &in, Person &Record);
friend inline int operator << (const Person &oper1, const Person &Record);
Ho ridefinito gli opeatori qui sopra, però quando tento di usare il terzo (all'interno di un test) mi viene dato un errore da parte del compilatore.
Grazie.
Quale errore ?
Sicuro che possa essere const il parametro di sinistra dello schift logico ? Solitamente non lo è...sarà per questo ?
se conpilo senza fare uso di questo operatore logico non viene dato alcun errore, ma se invece magari inserisco:
if (var1 << var2 )
cout << "Ciao" << endl;
mi viene dato un errore.
Booo
main.cpp: In function `int main ()':
main.cpp:128: invalid operands of types `Person *' and `Person *' to
binary `operator<<'
make: [main] Error 1 (ignored)
Ecco l'errore che mi da' il compilatore.
Non saprei.....
var1 e var2 sono dichiarate così ?
Person var1, var2;
Sembra che le veda come puntatori....
Le variabili le ho dichiare dinamicamente:
Person *var1 = new Person;
Person *var2 = new Person;
Potrebbe essere questo l'errore???
Per caso dovrei fare:
if (*var1 >> *var2)
cout <<"..." ;
Grazie
Ho provato a fare come ho scritto sopra, ma niente.
Bo, se sai come mai non funziona te ne sarei grato.
A me funziona...ho fatto qualche prova...
#include <iostream.h>
class Person {
int num;
public:
Person():num(1){};
friend int operator<< (const Person &p1, const Person &p2);
};
inline int operator<< (const Person &p1, const Person &p2) { return p1.num+p2.num; }
void main()
{
Person var1, var2, *var3, *var4;
var3 = new Person;
var4 = new Person;
int i = var1 << var2;
cout << i;
i = *var3 << *var4;
cout << i;
delete var3;
delete var4;
}
/\/\@®¢Ø
30-01-2002, 19:02
Il problema sta nel fatto che la funzione si aspetta due oggetti di quel tipo ( da passare come reference ) , mentre tu passi solo il puntatore . Devi invece dereferenziarlo prima.
Quello che hai scritto tu va quasi bene,
Quasi perche' il compilatore probabilmente prima cerca di fare lo shift e poi usare l'operatore << ( almeno penso ).
Con
if ( (*var1) << (*var2) )
cout << "Ciao" << endl;
Dovrebbe funzionare tutto =)
Ho provato a fare quello che mi avete consigliato, ma non funziona. Non è che mi può dare problemi problemi questa funzione ????
friend ostream &operator << (ostream &out, Person &Record);
Ho provato da solo il codice di cioci e tutto funzionava.
Ciao Grazie
Boh...a me funzionano anche gli altri operatori...
#include <iostream.h>
class Person {
int num;
public:
Person():num(1){};
friend int operator << (const Person &p1, const Person &p2);
friend ostream &operator << (ostream &out, Person &Record);
friend istream &operator >> (istream &in, Person &Record);
};
inline int operator<< (const Person &p1, const Person &p2) { return p1.num+p2.num; }
ostream &operator << (ostream &out, Person &Record)
{
return (out << Record.num);
}
istream &operator >> (istream &in, Person &Record)
{
return (in >> Record.num);
}
void main()
{
Person var1, var2, *var3, *var4;
var3 = new Person;
var4 = new Person;
int i = var1 << var2;
cout << i;
i = *var3 << *var4;
cout << i << endl;
cin >> var1;
cin >> *var3;
cout << var1 << " " << *var3 << endl;
delete var3;
delete var4;
}
Grazie, adesso provo, ti faccio sapere.
Ancora grazie
Ho provato, ma ancora non mi funziona.
Non so che dirti...in teoria non importa quale sia il "contenuto" della classe...la dichiarazione degli opertori che usato nell'esempio dovrebbe andare bene lo stesso. Quindi a questo punto il problema è altrove... Ma che errore ti da ? Sempre il solito ?
Si si, sempre il solito errore.
Vabbe' provero' a controllare anche tutto il resto.
Ciao Grazie
Ma la famosa riga 128 in cui viene generato l'errore com'è ?
La riga 128 è cosi' scritta:
i = *ciao1 << *ciao2 ;
dove i è una variabile di tipo intero
E ciao1 e ciao2 come sono dichiarate...l'errore esatto è sempre quello che hai scritto sopra ? Hai provato con le parentesi ?
Si si, le ho dichiarate e ho provato anche con le parentesi.
Ma non è che puoi postare l'intero codice ?
Ok, per questa sera riesco a metterlo.
Grazie
Scusa se non ho potuto scrivere ieri sera, comunque adesso che controllo meglio l'errore che compare è un'altro :
/tmp/ccIKNDgA.o: In function `main':
/tmp/ccIKNDgA.o(.text+0x1d6): undefined reference to `operator<<(Person const &, Person const &)'
collect2: ld returned 1 exit status
make: [main] Error 1 (ignored)
Ciao Grazie
Ma il listato ? E' meglio se posti quello...
Per listato intendi il file contenente il main e quello contenente il codice relativo alle classe Person ???? o proprio tutto!!!!
Mettilo uno zip e allegalo al post...così ti ci do un'occhiata veloce...
Ok, eccoti il codice.
grazie
Credevo che fosse qualcosa di + semplice...purtroppo senza vederla girare è un casino...
Lo so, è non è neanche tutto.
Comunque se riesci grazie.
Lo so...ma senza poterlo compilare è difficile...
/\/\@®¢Ø
03-02-2002, 18:28
L'errore avviene in fase di linking, non di compilazione.
Dal log sembra quasi che tu abbia cercato di creare l'eseguibile senza utilizzare tutti i files ( ad esempio compilando tutti e due i files, ma linkando solo uno ).
Che comandi hai usato per compilare ?
uso makefile, magari lo scritto male, provo a darci una controllata
per compilare uso c++ .
Ho provato a compilare tutto in un colpo, ma l'errore che compare è sempre lo stesso.
/\/\@®¢Ø
03-02-2002, 21:50
Forse ho trovato:
nel file Person.h tu hai
class Person
{
<cut>
friend int operator <<(const Person &oper1, const Person &oper2);
};
Con questo tu pero' non hai dichiarato la funzione, hai solo dichiarato solo che e' friend.
All'esterno della classe dovrai aggiungere la riga
int operator << (const Person &oper1,const Person &oper2);
Non ho un compilatore sottomano, prova a vedere e dimmi se ti funziona
Ciao
Marco
P.S.:Se non sbaglio dichiararla inline poco aiuta visto che la definisci in un file e la usi in un altro ( a meno di compilatori particolarmente ottimizzanti, ma allora lo farebbero comunque ).
OK Marco, avevi proprio ragione, "friend ... " non comprende il prototipo della funzione, per cui questo deve essere scritto all'esterno della classe, anche "inline" non andava messo.
Comunque grazie ancora, funziona tutto alla grande adesso.
Ciao :) :D :cool:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.