Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Werwofl

Treue Seele

  • »Werwofl« ist der Autor dieses Themas

Beiträge: 100

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

1

06.06.2011, 08:27

const-Übergabeparameter

Moin moin,

so ich habe, wie sollte es auch anders sein ein kleines Problemchen.
Ich habe einfach mal mit Operatoren-Überladung rumgespielt und bin mit dem const auf ein Verständnissproblem gestoßen.
Ich zeig euch einfachmal ein bisschen Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Test{
public:
      Test operator+(const Test &t){
             Test result;
             Test.setA(t.getA()+this->getA());
              return result;
      }
      void setA(int i){
             a = i;
      }
      
      int getA(){
            return a;
      }
private:
int a;
}


Soweit ich verstanden habe sorgt const lediglich dafür das ich Paramter nicht verändern darf. Aber warum meckert der wenn ich versuche t.getA() aufzurufen mit:

Zitat

"passing 'const Test' as 'this' argument of''int Test::getA() discard qualifiers"

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

2

06.06.2011, 08:37

Weil getA() nicht als const deklariert ist. Denn wie du schon richtig gesagt hast darfst du eine const variable nicht verändern. Da die Methode aber nicht const ist meckert der compiler halt.

3

06.06.2011, 09:13

Bei einem (nicht statischen) Methodenaufruf wird als versteckter letzter Parameter immer der Zeiger auf das Objekt übergeben, dass die Methode aufgerufen hat. Deklarierst du die Methode als const, ist dieser auch Konstant, sonst eben nicht.
Daher kannst du von einem konstanten Objekt nur konstante Methoden aufrufen, weil du sonst einen const-Pointer als nicht konstanten Parameter übergeben würdest und die Methode das Objekt ändern könnte.
In deinem Fall müsste es so aussehen:

C-/C++-Quelltext

1
2
3
4
 int getA() const
{
      return a;
}
Lieber dumm fragen, als dumm bleiben!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

06.06.2011, 17:17

Bei einem (nicht statischen) Methodenaufruf wird als versteckter letzter Parameter immer der Zeiger auf das Objekt übergeben, dass die Methode aufgerufen hat.

Äh... das stimmt so nicht ganz. Und für das Thema ist das auch unerheblich ;)
Was Du sicher meinst ist, dass kein Member von "this" in einer const-Methode verändert werden darf/kann.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

06.06.2011, 18:12

Was Du sicher meinst ist, dass kein Member von "this" in einer const-Methode verändert werden darf/kann.

Weil this dort vom Typ const T* ist...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

06.06.2011, 18:17

Joar. Aber in wie fern ist es relevant, dass "this" als versteckter Parameter übergeben wird? Tut doch rein gar nichts zur Sache. Es ist nur wichtig, dass "this" vorhanden und const ist. Das wäre auch eine deutlich bessere Antwort gewesen, als über unsichtbare Parameter zu reden. Immerhin hat die technische Umsetzung des Compilers mit der Intention der Sprach-Definition ja nichts zu tun.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

06.06.2011, 18:18

Hat er ja auch gesagt!?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

06.06.2011, 18:21

Vergiss es, dot.
Aber es ist schlicht falsch, was da steht. Denn da wird nicht das Objekt übergeben, welches den Call durchgeführt hat. Und relevant ist die Art der Übergabe von "this" auch nicht. Aber is egal, es führt mal wieder nirgendwo hin.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

06.06.2011, 18:37

Aber es ist schlicht falsch, was da steht. Denn da wird nicht das Objekt übergeben, welches den Call durchgeführt hat.

Was denn sonst?
Der Verweis auf das Objekt, dass die Funktion aufgerufen hat ist mit dabei. Wie das geschieht ist natürlich unerheblich (und nicht spezifiziert), aber man kann sich das schon als versteckten Parameter vorstellen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

06.06.2011, 18:43

Der Verweis auf das Objekt, dass die Funktion aufgerufen hat ist mit dabei.

Nein. Lest doch bitte, was da steht. Da steht "Zeiger auf das Objekt übergeben, dass die Methode aufgerufen hat" und nicht "Zeiger auf das Objekt, dessen Methode aufgerufen wird". Der Aufrufer wird NICHT übergeben (auch nicht im Stack per call, sondern das ist nur eine Rücksprungadresse), sondern der Aufgerufene:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class Foo;
class Bar
{
   void Methode()
   {
      Foo x;
      x.foobar(); // hier wird NICHT Bar übergeben, sondern x. Der Aufgerufende, nicht der Aufrufer!
   }
}


Vielleicht ist das ja jetzt deutlich genug. Und selbst wenn es richtig da gestanden hätte, dann wäre das noch immer kein Grund, warum eine const-Methode keine Attribute des Objekts verändern kann. Der Grund ist der Zusatz "const" und nicht die Übergabe der Objekt-Referenz "this". Und schon gar nicht die Art und Weise als "versteckter Parameter". Das ist absolut unerheblich.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »BlueCobold« (06.06.2011, 18:51)


Werbeanzeige