Pagina 1 di 2

[C++] Problema con puntatore this

MessaggioInviato: 24/07/2019, 14:32
da ZfreS
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?

Re: [C++] Problema con puntatore this

MessaggioInviato: 24/07/2019, 14:45
da Raptorista
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.

Re: [C++] Problema con puntatore this

MessaggioInviato: 25/07/2019, 13:31
da ZfreS
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?

Re: [C++] Problema con puntatore this

MessaggioInviato: 25/07/2019, 15:49
da Raptorista
L'istruzione total.isbn() restituisce il valore di total.bookNo, se è questo che stai chiedendo. units_sold e revenue non c'entrano qui.

Re: [C++] Problema con puntatore this

MessaggioInviato: 25/07/2019, 17:56
da Super Squirrel
Magari dai un'occhiata qui:
http://www.bo.cnr.it/corsi-di-informatica/corsoCstandard/Lezioni/27Classi.html
l'ultimo paragrafo spiega l'argomento in modo abbastanza semplice ed esaustivo.

Re: [C++] Problema con puntatore this

MessaggioInviato: 26/07/2019, 10:06
da vict85
Forse è un po' tecnico ma puoi leggere una documentazione completa su quella keyword a questa pagina: https://en.cppreference.com/w/cpp/language/this

In 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 esplicita1, 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;

Note

  1. Insomma ciò che è vero a livello semantico non è necessariamente vero a livello di codice prodotto dal compilatore. A livello di codice prodotto, le due cose sono equivalenti, ma non lo sono all'interno della semantica del C++.

Re: [C++] Problema con puntatore this

MessaggioInviato: 26/07/2019, 10:14
da ZfreS
@ 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?

Re: [C++] Problema con puntatore this

MessaggioInviato: 26/07/2019, 13:39
da vict85
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).

Re: [C++] Problema con puntatore this

MessaggioInviato: 26/07/2019, 18:20
da Raptorista
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

Re: [C++] Problema con puntatore this

MessaggioInviato: 27/07/2019, 09:23
da ZfreS
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.