[C++] Problema con puntatore this

Messaggioda ZfreS » 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?
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1781 di 4589
Iscritto il: 22/10/2016, 17:52

Re: [C++] Problema con puntatore this

Messaggioda Raptorista » 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.
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 5304 di 9616
Iscritto il: 28/09/2008, 19:58

Re: [C++] Problema con puntatore this

Messaggioda ZfreS » 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?
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1782 di 4589
Iscritto il: 22/10/2016, 17:52

Re: [C++] Problema con puntatore this

Messaggioda Raptorista » 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.
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 5310 di 9616
Iscritto il: 28/09/2008, 19:58

Re: [C++] Problema con puntatore this

Messaggioda Super Squirrel » 25/07/2019, 17:56

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.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 369 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] Problema con puntatore this

Messaggioda vict85 » 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/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++.
vict85
Moderatore
Moderatore
 
Messaggio: 9773 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C++] Problema con puntatore this

Messaggioda ZfreS » 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?
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1783 di 4589
Iscritto il: 22/10/2016, 17:52

Re: [C++] Problema con puntatore this

Messaggioda vict85 » 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).
vict85
Moderatore
Moderatore
 
Messaggio: 9775 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C++] Problema con puntatore this

Messaggioda Raptorista » 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
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 5312 di 9616
Iscritto il: 28/09/2008, 19:58

Re: [C++] Problema con puntatore this

Messaggioda ZfreS » 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.
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1784 di 4589
Iscritto il: 22/10/2016, 17:52

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite