Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: c++ this pointer?  (gelezen 6610 keer)

Shonof

  • Gast
c++ this pointer?
« Gepost op: 2008/05/20, 12:44:56 »
Ik zit al een tijdje c++ te leren via een boek, maar ik snap maar niet wat een this pointer is en doet.
Bijv. dit hieronder doet hij het met een this pointer en zonder een this pointer. Waarom zou je het met een this pointer doen?

-------------------------

class this_pointer_example // class for explaining C++ tutorial
    {
        int data1;
     public:
        //Function using this pointer for C++ Tutorial
        int getdata()
        {
            return this->data1;
        }
      //Function without using this pointer
      void setdata(int newval)
      {
           data1 = newval;
      }
 };

-------------------------

Mischiem is er iemand die mij kan helpen?

Offline JvH

  • Lid
c++ this pointer?
« Reactie #1 Gepost op: 2008/05/20, 13:31:16 »
This is een pointer naar het huidige object. Waarom de schrijver in het bovenstaande voorbeeld alleen in getdata this gebruikt is mij ook niet helemaal duidelijk. Wel is het zo dat je die this-notatie kunt gebruiken om je code iets duidelijker/inzichtelijker te maken.

Even doorgaand op jouw codevoorbeeldje. Stel je hebt totaal geen fantasie, en gebruikt daarom voor zowel de klassevariabele als het argument van setdata de naam 'data':
class this_pointer_example
{
   int data;
   public:
      void setdata(int data)
      {
         this->data = data;
      }
};
In dit geval maak je d.m.v. 'this->' duidelijk dat je het links van de = over de klassevariabele hebt, en rechts van de = over de parameter. Als het goed is zou dit voorbeeld trouwens ook zonder this moeten werken.

Shonof

  • Gast
c++ this pointer?
« Reactie #2 Gepost op: 2008/05/20, 13:49:02 »
Dat is nou super uitleg! Bedankt voor de uitleg ik snap het helemaal!

Offline JvH

  • Lid
c++ this pointer?
« Reactie #3 Gepost op: 2008/05/20, 15:05:55 »
Graag gedaan :)

Shonof

  • Gast
c++ this pointer?
« Reactie #4 Gepost op: 2008/05/30, 19:56:54 »
Waarom werkt dit alleen maar met -> dan en niet met een .???

hieronder is de code
Ik hoop dat er iemand is die mij kan helpen.
---------------------------------------------
---------------------------------------------

#include
using namespace std;

class Rechthoek {
   public:
      Rechthoek();
      ~Rechthoek();      
      void lengteInstellen(int lengte) { zijnLengte = lengte; }
      int lengteOphalen() const { return zijnLengte; }
      void breedteInstellen(int breedte) { zijnBreedte = breedte; }
      int breedteOphalen() const { return zijnBreedte; }
   
   private:
      int zijnLengte;
      int zijnBreedte;
};

Rechthoek::Rechthoek() {
   zijnLengte = 5;
   zijnBreedte = 10;
}

Rechthoek::~Rechthoek() {}

int main() {
   Rechthoek * pRecht = new Rechthoek;
   const Rechthoek * P_CONST_RECHT = new Rechthoek;
   Rechthoek * const P_CONST_AANW = new Rechthoek;
   cout << "pRecht breedte: " << pRecht->breedteOphalen() << "meter\n";
   cout << "P_CONST_RECHT: breedte" << P_CONST_RECHT->breedteOphalen() << "meter\n";
   cout << "P_CONST_AANW: breedte" << P_CONST_AANW->breedteOphalen() << "meter\n";
   
       // --------------------------------------------
       //vanaf hier klopt het niet meer!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       // . moet ->
       // --------------------------------------------
   pRecht.breedteInstellen(10);
   P_CONST_AANW.breedteInstellen(10);
   
   cout << "pRecht breedte: " << pRecht.breedteOphalen() << "meter\n";
   cout << "P_CONST_RECHT breedte: " << P_CONST_RECHT.breedteOphalen() << "meter\n";
   cout << "P_CONST_AANW breedte: " << P_CONST_AANW.breedteOphalen() << "meter\n";
   
   return 0;
}

Offline profoX

  • Lid
    • wesley
    • Lionslink
c++ this pointer?
« Reactie #5 Gepost op: 2008/05/30, 21:04:42 »
Omdat je de Rechthoek pRecht op de heap aanmaakt (met de new operator) daarom moet je -> gebruiken. Als je het op de stack zou aanmaken dan zou je . gebruiken:

bijvoorbeeld zo, als ik me niet vergis:

int main() {
    Rechthoek pRecht;
    const Rechthoek P_CONST_RECHT;
    Rechthoek const P_CONST_AANW;

    pRecht.breedteInstellen(10);
    P_CONST_AANW.breedteInstellen(10);
   
    cout << "pRecht breedte: " << pRecht.breedteOphalen() << "meter\n";
    cout << "P_CONST_RECHT breedte: " << P_CONST_RECHT.breedteOphalen() << "meter\n";
    cout << "P_CONST_AANW breedte: " << P_CONST_AANW.breedteOphalen() << "meter\n";

    return 0;
}

Verder moet je eigenlijk voor elke "new" een corresponderende "delete" hebben die het object terug verwijderd. Wat is nu eigenlijk het verschil tussen heap (met new) en stack? Hier is een vrij uitgebreide uitleg: http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline idefix

  • Lid
c++ this pointer?
« Reactie #6 Gepost op: 2008/05/30, 21:10:54 »
Je moet -> gebruiken ipv . omdat je pointers naar objecten (rechthoeken) gedeclareerd hebt:
Rechthoek * pRecht = new Rechthoek;Als je objecten gebruikt had (en dus geen pointers naar objecten, had je . kunnen gebruiken:
rechthoek r1;
cout << "r1 breedte: " << r1.breedteOphalen() << "meter\n";
r1 is hier van het type Rechthoek en niet van het type pointer naar Rechthoek

Edit: ProFox was me voor...
Support bacteria. They're the only culture some people have.

Shonof

  • Gast
c++ this pointer?
« Reactie #7 Gepost op: 2008/05/30, 23:24:01 »
Veel behulzame progammeurs op dit forum! Bedankt voor het helpen.