Avatar billede zyxtem Nybegynder
23. oktober 2003 - 21:41 Der er 25 kommentarer og
1 løsning

Hvad gør this

Hey

  I en bog jeg er i gang med blev der nævnt noget med en this-pointer. Jeg ved godt at this er et keyword men hvad bruges det til?
Avatar billede soreno Praktikant
23. oktober 2003 - 21:43 #1
this refererer til det aktuelle objekt.
Avatar billede soreno Praktikant
23. oktober 2003 - 21:44 #2
Avatar billede soreno Praktikant
23. oktober 2003 - 21:45 #3
F.eks. kunne this bruges sådan:

void dostuff(int x)
{
  this->x = x;
}

Så opstår der ikke problemer med at se hvilken variabel der refereres til.
Avatar billede zyxtem Nybegynder
23. oktober 2003 - 21:45 #4
har du et link til et sted hvor jeg kan læse det. Gerne med eksempler...

this->g();  er ikke noget jeg har set før
Avatar billede viciodk Praktikant
23. oktober 2003 - 21:46 #5
Her er en beskrivelse af this i Java - næsten samme syntaks som i C++

http://www.developer.com/java/print.php/1440571
Avatar billede soreno Praktikant
23. oktober 2003 - 21:46 #6
Det betyder bare at metoden g() udføres i det aktuelle objekt.
Avatar billede zyxtem Nybegynder
23. oktober 2003 - 21:46 #7
Den bruger da altid den lokale...
Avatar billede zyxtem Nybegynder
23. oktober 2003 - 21:49 #8
Er totalt forvirret :(
Avatar billede zyxtem Nybegynder
23. oktober 2003 - 21:52 #10
Fandt en forklaring her...tror jeg nok :) http://cplus.about.com/library/weekly/aa081902c.htm
Avatar billede bertelbrander Novice
23. oktober 2003 - 21:54 #11
F.ex:

class X;

class Y
{
public:
  Y(X *x)
  {
    my_x = x;
  }
  X *my_x;
};

class X
{
public:
  X() : y(this) // Giv min y en pointer til mig
  {}
  Y y; 
  int p;
};
Avatar billede arne_v Ekspert
23. oktober 2003 - 22:07 #12
En slem gang spagetti (konverteret fra C#):

#include <iostream>

using namespace std;

class A;

class B
{
    private:
        A *a;
    public:
        B(A *a);
        void foobar();
};

class A
{
    private:
        B *b;
    public:
        int v;
        A(int v = 0);
        void foobar();
};

B::B(A *a)
{
    this->a = a; // argument shadows for instance member
}

void B::foobar()
{
    cout << a->v << endl;
}

A::A(int v)
{
    this->v = v; // argument shadows for instance member
    b = new B(this); // pass itself as argument
}

void A::foobar()
{
    b->foobar();
}

int main()
{
    A *a1 = new A(123);
    a1->foobar();
    A *a2 = new A();
    a2->foobar();
    return 0;
}
Avatar billede zyxtem Nybegynder
23. oktober 2003 - 22:11 #13
har forstået det nu. Lige en lille ting der stadig undrer mig
void f() const;// Detteher med const efter funktionen
void g();

this->g() //ulovligt g er ingen konstantfunktion

og så det med at man ikke kan gøre det med g.
Avatar billede arne_v Ekspert
23. oktober 2003 - 22:16 #14
void f() const;

const i denne sammenhæng betyder "jeg lover ikke at ændre på objektets tilstand"
Avatar billede arne_v Ekspert
23. oktober 2003 - 22:16 #15
pointen er at f kan kaldes på objekter der er const men det kan g ikke
(man kan jo ikke ændre på et const objekt)
Avatar billede zyxtem Nybegynder
23. oktober 2003 - 22:17 #16
så.
public:
int a;
void g() const
{
a=4;
cout<<"Jeg løj :D";
}

Hvorfor kan man så ikke sige this-> til en ikke const
Avatar billede arne_v Ekspert
23. oktober 2003 - 22:20 #17
Jeg tror at den der vil give dig en compile fejl "syntax error - lying code"
når du compiler koden.
Avatar billede arne_v Ekspert
23. oktober 2003 - 22:21 #18
Det sidste spørgsmål forstod jeg ikke.
Avatar billede arne_v Ekspert
23. oktober 2003 - 22:23 #19
class ZZ
{
  private:
      int v;
  public:
      ZZ() { v = 0; }
      void foobar1()
      {
        v++;
      }
      void foobar2() const
      {
        v++;
      }
};

C:\>g++ -c zz.cpp -o zz.obj
zz.cpp: In member function `void ZZ::foobar2() const':
zz.cpp:13: increment of data-member `ZZ::v' in read-only structure
Avatar billede zyxtem Nybegynder
24. oktober 2003 - 15:48 #20
mener denneher:
void f() const;
void g();

this->g() //ulovligt g er ingen konstantfunktion
Det står i en bog jeg er i gang med
Avatar billede arne_v Ekspert
24. oktober 2003 - 15:51 #21
Er det kald i en constructor ?
Avatar billede zyxtem Nybegynder
24. oktober 2003 - 15:54 #22
nej. f og g er interfacefunktioner i en klasse
Avatar billede arne_v Ekspert
24. oktober 2003 - 15:59 #23
Det tror jeg ikke er rigtigt.

Generelt.

Kun hvis this er et const objekt.
Avatar billede arne_v Ekspert
25. oktober 2003 - 00:33 #24
class ZZ
{
  private:
      int v;
  public:
      ZZ() { v = 0; }
      void foobar1()
      {
        v++;
      }
      void foobar2() const
      {
        //v++;
      }
      void foobar3()
      {
        this->foobar1();
        this->foobar2();
      }
      void foobar4() const
      {
        //this->foobar1();
        this->foobar2();
      }
};

De 2 udkommenterede linier compiler ikke - de andre gør.
Avatar billede zyxtem Nybegynder
26. oktober 2003 - 10:43 #25
Gider i ikke smide et svar så jeg kan lukke og slukke?
Avatar billede arne_v Ekspert
26. oktober 2003 - 12:12 #26
svar (selvom jeg kom lidt sent ind i tråden)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester