PDA

View Full Version : Overloading Operatori


Poix81
30-01-2002, 11:26
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.

cionci
30-01-2002, 14:48
Quale errore ?

Sicuro che possa essere const il parametro di sinistra dello schift logico ? Solitamente non lo è...sarà per questo ?

Poix81
30-01-2002, 16:02
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

cionci
30-01-2002, 16:23
Sì, ma quale errore ?

Poix81
30-01-2002, 17:24
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.....

cionci
30-01-2002, 17:40
var1 e var2 sono dichiarate così ?

Person var1, var2;

Sembra che le veda come puntatori....

Poix81
30-01-2002, 17:52
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

Poix81
30-01-2002, 18:09
Ho provato a fare come ho scritto sopra, ma niente.

Bo, se sai come mai non funziona te ne sarei grato.

cionci
30-01-2002, 19:01
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 =)

Poix81
30-01-2002, 19:35
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

cionci
30-01-2002, 19:44
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;
}

Poix81
30-01-2002, 22:10
Grazie, adesso provo, ti faccio sapere.

Ancora grazie

Poix81
31-01-2002, 16:11
Ho provato, ma ancora non mi funziona.

cionci
31-01-2002, 18:43
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 ?

Poix81
31-01-2002, 18:51
Si si, sempre il solito errore.

Vabbe' provero' a controllare anche tutto il resto.

Ciao Grazie

cionci
31-01-2002, 18:54
Ma la famosa riga 128 in cui viene generato l'errore com'è ?

Poix81
31-01-2002, 21:48
La riga 128 è cosi' scritta:

i = *ciao1 << *ciao2 ;

dove i è una variabile di tipo intero

cionci
01-02-2002, 01:10
E ciao1 e ciao2 come sono dichiarate...l'errore esatto è sempre quello che hai scritto sopra ? Hai provato con le parentesi ?

Poix81
01-02-2002, 08:09
Si si, le ho dichiarate e ho provato anche con le parentesi.

cionci
01-02-2002, 14:08
Ma non è che puoi postare l'intero codice ?

Poix81
01-02-2002, 15:08
Ok, per questa sera riesco a metterlo.

Grazie

Poix81
02-02-2002, 18:08
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

cionci
02-02-2002, 18:14
Ma il listato ? E' meglio se posti quello...

Poix81
02-02-2002, 18:31
Per listato intendi il file contenente il main e quello contenente il codice relativo alle classe Person ???? o proprio tutto!!!!

cionci
02-02-2002, 18:32
Mettilo uno zip e allegalo al post...così ti ci do un'occhiata veloce...

Poix81
02-02-2002, 18:51
Ok, eccoti il codice.

grazie

cionci
03-02-2002, 15:18
Credevo che fosse qualcosa di + semplice...purtroppo senza vederla girare è un casino...

Poix81
03-02-2002, 16:22
Lo so, è non è neanche tutto.

Comunque se riesci grazie.

cionci
03-02-2002, 16:30
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 ?

Poix81
03-02-2002, 18:41
uso makefile, magari lo scritto male, provo a darci una controllata

Poix81
03-02-2002, 21:35
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 ).

Poix81
03-02-2002, 22:27
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: