This Pointer

Gast #4205283
Ich stehe leider vor einem kleinen Verständnis Problem...Kann mir an 
diesem Beispiel den This pointer erklären ?
1
Metro::Metro()
2
{
3
  
4
  this->interval_millis = 1000;
5
  
6
}
7

8

9

10
Metro::Metro(unsigned long interval_millis)
11
{
12
  
13
  this->interval_millis = interval_millis;
14
  
15
}
16

17

18
void Metro::interval(unsigned long interval_millis)
19
{
20
  this->interval_millis = interval_millis;
21
}
22

23
uint8_t Metro::check()
24
{
25

26
  unsigned long now = millis();
27
  
28
  if ( interval_millis == 0 ){
29
    previous_millis = now;
30
  return 1;
31
  }
32
 
33
  if ( (now - previous_millis) >= interval_millis) {
34
  #ifdef NOCATCH-UP
35
  previous_millis = now ; 
36
  #else
37
  previous_millis += interval_millis ; 
38
   #endif
39
    return 1;
40
  }
41
  
42
  return 0;
43

44
}
45

46
void Metro::reset() 
47
{
48
 
49
  this->previous_millis = millis();
50

51
}
Ich stehe leider komplett auf dem Schlauch was bewirkt der ?

Gruß
Gast #4205701
Der this-Pointer ist in dem Code überflüssig. In vielen Fällen wird er 
deshalb innerhalb einer Klasse nicht verwendet.
Bitte lese die Verwendung des this-Pointers in einem C++-Buch nach.
#4205854
hase schrieb:
> Der this-Pointer ist in dem Code überflüssig. In vielen Fällen wird er
> deshalb innerhalb einer Klasse nicht verwendet.

ist er nicht, da der Parameter genauso heißt.
Auch wenn ich das als schlechten Stil bezeichnen würde.

private member variablen kriegen nach den meisten Konventionen auch ein 
"m_" davor, dann würde sich auch die Namensdopplung erübrigen.

Es muss auch nicht schlechter Stil sein, das this explizit 
hinzuschreiben, Wenn dann sollte man es aber konsequent machen. Das hat 
den Vorteil, dass man sofort beim Code lesen weiß, das es ein member und 
keine lokale Variable ist.
Gast #4205951
Ich habe den this Pointer immer im Visual-Studio benutzt.
Man schreibt this-> und sofort öffnet sich eine Popup-Box mit allen 
Klassenvariablen. Ging schneller als im .H-File nachzuschauen.

Das this-> wurde dann wieder entfernt.

Member und Parameter gleich zu benennen finde ich auch unschön. Member 
bekommen noch ein m_ spendiert, dann sieht man sofort, was für eine 
Variable das ist.
#4206032
Das solte alles klären: (alles getestet)

C++
1
// x.hpp
2
class X {
3
 public:
4
  int y;
5
  void func();
6
};
7
//x.cpp
8
#include<iostream>
9
#include "x.hpp"
10
void X::func(){
11
  std::cout << this << ", " << &y << std::endl;
12
}
13
//main.cpp
14
#include<iostream>
15
#include "x.hpp"
16
int main(){
17
  X x;
18
  std::cout << &x << std::endl;
19
  x.func();
20
}

C:
1
// x.h
2
typedef struct X {
3
  int y;
4
} X;
5
void _ZN1X4funcEv(X*);
6
// x.c
7
#include<stdio.h>
8
#include "x.h"
9
void _ZN1X4funcEv(X* this){
10
  printf("%p, %p\n",this,&this->y);
11
}
12
// main.c
13
#include<stdio.h>
14
#include "x.h"
15
int main(){
16
  X x;
17
  printf("%p\n",&x);
18
  _ZN1X4funcEv(&x);
19
}

Kompiliren:
1
gcc x.c -c -o x.c.o
2
gcc main.c -c -o main.c.o
3
g++ x.cpp -c -o x.cpp.o
4
g++ main.cpp -c -o main.cpp.o
5
gcc main.c.o x.c.o -o c
6
g++ main.cpp.o x.cpp.o -o cpp
7
g++ main.cpp.o x.c.o -o quirx1
8
g++ main.c.o x.cpp.o -o quirx2
Ausfüren:
1
./c
2
./cpp
3
./quirx1
4
./quirx2
Ausgabe:
1
$ ./c
2
0x7ffc5200db40
3
0x7ffc5200db40, 0x7ffc5200db40
4
$ ./cpp
5
0x7ffe49cc4810
6
0x7ffe49cc4810, 0x7ffe49cc4810
7
$ ./quirx1
8
0x7ffc95566bb0
9
0x7ffc95566bb0, 0x7ffc95566bb0
10
$ ./quirx2
11
0x7ffee090a0a0
12
0x7ffee090a0a0, 0x7ffee090a0a0

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.