View Full Version : [C++] operatore di assegnamento: overloading e sottoclassi.
ho un problemino di C++
dopo aver cercato invano sul web e sui libri senza essere venuto a capo di nulla mi rassegno e vengo a rompere le scatole a voi...
dovendo creare una sorta di "database" ho creato delle classi tipo_di_dato;
per i diversi tipi di dati da memorizzare, e una classe generica che contenesse le diverse entry.
in questo modo il generico membro del database sarebbe accessibile come
database1.tipo_di_dato1.read();
database1.tipo_di_dato1.write();
volendo rimpiazzare read e write avevo pensato all'overloading dell'operatore di assegnamento, purtroppo però non trovo un esempio che chiarisca una situazione del genere..
qualcuno mi sa delucidare su un problema del genere?!?
in tutti gli esempi presentati propongono l'operatore assegnamento per un'operazione del tipo
tipo_di_dato1 = 3;
operazione che non funziona, chiaramente, per
database1.tipo_di_dato1 = 3;
wizard1993
14-08-2008, 08:02
in che linguaggio?
in che linguaggio?
pardon C++
ero talmente preso dalle cose da fare che mi sono persino scordato di scriverlo.......
dopo aver cercato invano sul web prima di cercare la pagliuzza nell'occhio altrui, osserva la trave che c'è nel tuo :asd:
com'era, UTFSE? :D
prima di cercare la pagliuzza nell'occhio altrui, osserva la trave che c'è nel tuo :asd:
com'era, UTFSE? :D
e di grazia dov'è che avrei dovuto cercare oltre che nei manuali di c++ e sul web con google, compreso hwupgrade!?!
perchè visto il tuo facile umorismo, dovrei aver mancato di cercare in qualche posto a dir poco ovvio...
tornando al problema
io ho già provato l'implementazione "canonica" suggerita nei manuali, ma ovviamente non funziona, perchè passo la reference sbagliata e non so come identificare il membro di una classe tramite reference, membro di cui devo assegnare... ...un membro...
ho già cercato ma tutti gli esempi che ho trovato usano l'overloading di assegnamento per assegnare contemporaneamente tutti i membri di una classe, mentre a me interessa un membro specifico da passare come parametro...
se qualcuno fosse così gentile da indicarmi una guida sull'argomento, o di indicarmi anche sommariamente il prototipo dell'operatore sarebbe cosa gradita...
grazie per l'aiuto.
DanieleC88
17-08-2008, 21:09
Scusa, ma non basta fare una cosa del genere (vado a senso):
class C
{
tipo_t dato;
/* ... */
public:
/* ... */
C& operator=(const C& ref)
{
dato = ref.dato;
return this;
}
tipo_t operator=(tipo_t d)
{
dato = d;
}
}
Per aggirare la necessità della Write()?
Scusa, ma non basta fare una cosa del genere (vado a senso):
class C
{
tipo_t dato;
/* ... */
public:
/* ... */
C& operator=(const C& ref)
{
dato = ref.dato;
return this;
}
tipo_t operator=(tipo_t d)
{
dato = d;
}
}
Per aggirare la necessità della Write()?
nel mio caso la situazione è più
class dato_t
{
int value;
}
class C
{
public:
dato_t dato1;
dato_t dato2;
dato_t dato3;
public:
/* ... */
}
per cui non posso passare un riferimento a "C"
devo passare un riferimento a dato1, o dato2 o dato3, per andare a scrivere sul membro "value" del caso...
DanieleC88
18-08-2008, 15:04
Se non hai modo di distinguere i tipi, non credo ci siano molte alternative alla definizione di metodi diversi da usare a seconda del caso... :)
Se non hai modo di distinguere i tipi, non credo ci siano molte alternative alla definizione di metodi diversi da usare a seconda del caso... :)
quindi in pratica siccome l'assegnamento non prevede alcun riferimento al membro di sinistra all'infuori di "this"
se io faccio una cosa del tipo
padre.figlio = valore;
l'assegnamento non viene applicato a figlio, ma a padre?
edit:
o più correttamente l'assegnamento viene applicato a tutti i membri dello stesso tipo di "figlio"??
DanieleC88
18-08-2008, 16:32
No, l'operatore lo stai definendo tu e sei tu a dire dove dovrà andare quel dato: semplicemente se alla destra c'è un tipo diverso, devi fare un operatore diverso per leggere quel tipo. Per farti un esempio, se hai una classe che rappresenti un numero complesso puoi voler distinguere i due casi in cui l'assegnamento viene da un altro oggetto "numero complesso" oppure da una struttura con due campi numerici che rappresentano rispettivamente parte reale e parte immaginaria: i dati in input sono di tipo diverso e in questo caso ti tocca fare l'overloading dell'operatore di assegnazione.
ciao ;)
No, l'operatore lo stai definendo tu e sei tu a dire dove dovrà andare quel dato: semplicemente se alla destra c'è un tipo diverso, devi fare un operatore diverso per leggere quel tipo. Per farti un esempio, se hai una classe che rappresenti un numero complesso puoi voler distinguere i due casi in cui l'assegnamento viene da un altro oggetto "numero complesso" oppure da una struttura con due campi numerici che rappresentano rispettivamente parte reale e parte immaginaria: i dati in input sono di tipo diverso e in questo caso ti tocca fare l'overloading dell'operatore di assegnazione.
ciao ;)
su questo non ci piove...
ma se i dati di input sono uguali non c'è overloading che tenga...
se ho due membri dello stesso tipo, ad esempio chiamo tali membri A e B, e volessi assegnare alternativamente o all'uno o all'altro un oggetto di tipo int, ad esempio, non ho posso fare alcun overloading, in quanto avrei sempre lo stesso prototipo... sbaglio?
DanieleC88
18-08-2008, 17:30
Appunto ti sto dicendo da due post che o separi i tipi o assegni usando funzioni personalizzate... :D
Appunto ti sto dicendo da due post che o separi i tipi o assegni usando funzioni personalizzate... :D
a dir la verità io qui
http://www.hwupgrade.it/forum/showpost.php?p=23723579&postcount=10
avevo chiesto una cosa leggermente differente :asd: che cmq non era essenziale...
grazie dell'aiuto e a buon rendere...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.