Discussioni su argomenti di Informatica
24/07/2019, 14:32
Buongiorno! Sto studiando la OOP dal testo C++ Primer e mi sto interfacciando con il puntatore this. La spiegazione di introduzione non mi è molto chiara. Questo è il codice con la classe:
- Codice:
struct Sales_data
{
std::string bookNo;
unsigned units sold = 0;
double revenue = 0.0;
std::string isbn() const {return bookNo;}
Sales_data& combine(const Sales_data&);
double avg_price() const;
};
Sales_data total;
if(read(cin, total))
{
Sales_data trans;
while(read(cin, trans))
if(total.isbn() == trans.isbn())
total.combine(trans);
else
{
print(cout, total) << endl;
total = trans;
}
print(cout, total) << endl;
}
else
{
cerr << "No Data!" << endl;
}
}
Ovviamente il codice così com'è scritto non è compilabile, ma non importa questo, importa capire cosa dice il libro.
Dice che quando chiamiamo una funzione membro, noi la chiamiamo su richiesta di un oggetto come per esempio total.isbn(). Quel che non capisco è questo: continua dicendo che quando isbn si riferisce ai membri di Sales_data (come bookNo), esso si sta riferendo implicitamente ai membri dell'oggetto sui quali la funzione è stata chiamata. In questa chiamata quando isbn restituisce bookNo sta implicitamente restituendo total.bookNo e lo fa attraverso un parametro implicito, un puntatore chiamato this. Questo serve a tenere traccia in memoria dell'oggetto total. Non capisco. Cosa c'entra total con bookNo? Sono due variabili diverse, come è possibile scrivere total.bookNo. bookNo non è un metodo.
Potreste chiarirmi questo per favore?
24/07/2019, 14:45
ZfreS ha scritto:Cosa c'entra total con bookNo? Sono due variabili diverse, come è possibile scrivere total.bookNo. bookNo non è un metodo.
Tramite il punto puoi accedere a tutti i membri di una classe, inclusi i "data members", non solo ai metodi.
total
è un'istanza della classe
Sales_data
, e come tale possiede un
bookNo
.
25/07/2019, 13:31
Quindi il in realtà il metodo isbn() quando chiamato sull'oggetto total si riferisce implicitamente sia a bookNo, sia a units_sold, sia a revenue, giusto?
25/07/2019, 15:49
L'istruzione total.isbn()
restituisce il valore di total.bookNo
, se è questo che stai chiedendo. units_sold
e revenue
non c'entrano qui.
25/07/2019, 17:56
Magari dai un'occhiata qui:
http://www.bo.cnr.it/corsi-di-informatica/corsoCstandard/Lezioni/27Classi.htmll'ultimo paragrafo spiega l'argomento in modo abbastanza semplice ed esaustivo.
26/07/2019, 10:06
Forse è un po' tecnico ma puoi leggere una documentazione completa su quella keyword a questa pagina:
https://en.cppreference.com/w/cpp/language/thisIn generale, devi capire che una funzione membro (non statica) è in realtà una funzione normale in cui il primo parametro è il puntatore a
this
. Insomma, anche se non ti è possibile scriverlo in maniera esplicita
1, ti conviene pensare
total.isbn( )
come
isbn( &total )
e
this
come il nome di quello specifico puntatore all'interno della funzione membro.
Non puoi assegnare una funzione membro ad un normale puntatore a funzione (devi usare un puntatore a funzione membro), ma un modo in cui puoi vedere esplicitamente l'equivalenza è attraverso l'oggetto std::function. Infatti puoi scrivere:
- Codice:
std::function< std::string(Sales_data *) > isbn = &Sales_data::isbn;
26/07/2019, 10:14
@ Raptorista Penso di aver risolto il problema. Il metodo isbn viene tradotto come total.bookNo perchè deve restituire un bookNo. Non avevo fatto attenzione al dato restituito.
@ supersquirrel, @ vict85
Grazie ad entrambi per i link, ho capito più da lì che dal libro. Il c++ primer lo conoscete?
26/07/2019, 13:39
Se parli di quello di Lippman (ovvero quello senza il plus nel nome) è un libro abbastanza apprezzato (io non l'ho mai letto), ma non per principianti. Insomma, come il manuale di Stroustrup, si tratta più di un libro di riferimento che un vero e proprio manuale per imparare. Sinceramente, non sono sicuro quanto siano davvero utili questo genere di libri dato che puoi ormai guardare le varie cose in siti tipo quello che ti ho mandato. Insomma dopo aver imparato le basi e fatto esperienza "sul campo", ritengo che tu possa aver più bisogno di libri su argomenti specifici piuttosto che su tutto il C++. Per esempio, esistono libri sull'uso dei puntatori, sui template, sulla libreria standard, sulla programmazione parallela, programmazione sicura e libri di consigli come i libri di Scott Meyers (Effective C++ e successivi).
26/07/2019, 18:20
Giusto per completezza sull'argomento libri, segnalo una guida abbastanza nota alla scelta di un buon libro per il C++
https://stackoverflow.com/questions/388 ... e-and-list
27/07/2019, 09:23
Si, io ho il Lippman ma nella guida suggerita da Raptorista considera quel libro come principiante, cosa che in realtà non è. Infatti mi sto apoggiando anche ad un altro testo.
Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000—
Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.