Forum: PC-Programmierung This Pointer


von Jok (Gast)


Lesenswert?

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ß

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Was sagt denn dein C++-Buch dazu?

Ansonsten schau dir die Definition der Klasse Metro an, vielleicht 
kommst du damit weiter.

Oliver

von Stefan. S. (stef_s)


Lesenswert?

Jok schrieb:
> Ich stehe leider komplett auf dem Schlauch was bewirkt der ?

Willst du dass wir es dir einfach hinklatschen oder möchtest du selbst 
drauf kommen?

Überleg mal was passieren würde wenn du eine globale Variable mit 
gleichem Namen hättest? ;-)


Gruß Stefan

von hase (Gast)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

Der This Pointier zeigt auf das Objekt selbst.
Da der Erstelle des Codes aber so schlau war Klassenmember und 
Übergabeparameter gleich zu nennen ist er hier ein paar mal notwendig.

: Bearbeitet durch User
von Mehmet K. (mkmk)


Lesenswert?

Forum: Projekte & Code

Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel vorstellen 
und diskutieren. Bitte hier keine Fragen posten!

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

: Bearbeitet durch User
von PittyJ (Gast)


Lesenswert?

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.

von Daniel A. (daniel-a)


Lesenswert?

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

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.