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

Inatrox

Frischling

  • »Inatrox« ist der Autor dieses Themas

Beiträge: 61

Wohnort: Dresden

  • Private Nachricht senden

1

12.06.2016, 22:49

[C++] Unterscchied zwischen Getter und const Getter

Hallo Leute,

ich habe in einem Buch folgende zwei Zeilen:

Resource get(Identifier id);
const Resource& get(Identifier id) const;

Sie stehen in einem Template daher das Resource und Identifier. Nun meine Frage was ist denn nun der genau Unterschied der beiden Funktionen und wie ruft man sie auf? ?(

MfG Inatrox
cout << "Programmieren muss sein" << endl;

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

12.06.2016, 23:13

Funktionen die const sind (so wie die zweite oben) kann man auf Objekten aufrufen, die const sind. In der Regel sollte man 1) sowas wie Getter gar nicht verwenden und 2) wenn es wirklich sein muss, sollten die const sein.

Julién

Alter Hase

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

3

13.06.2016, 00:14

Methoden die als 'const' deklariert sind, dürfen kein Attribut der Klasse verändern, es sei denn, das Attribut wurde als 'mutable' deklariert.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

13.06.2016, 06:37

Die beiden Zeilen haben aber noch mehr Unterschiede:
- Resource& get(id) liefert eine Referenz. Resource get(id) liefert eine Kopie. Letzteres ist ziemlich sicher in diesem Kontext nicht erwünscht. Wer will schon einfach so Ressourcen kopieren?
- const Resource& liefert eine read-only Referenz. Man kann sie also nicht verändern.
- typ name() const ist das, was die Jungs schon sagten: Die Methode ändert beim Aufruf das Objekt nicht, darf also auch dann aufgerufen werden, wenn man von dem Objekt nur eine const-Version hat - siehe vorhergehenden Punkt. Dort kommt eine const-Referenz zurück und man darf auf ihr nur Methoden aufrufen, die ebenfalls const sind.

Const-Correctness ist in C++ ein großes Thema. Also immer schön drauf achten.
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]

Inatrox

Frischling

  • »Inatrox« ist der Autor dieses Themas

Beiträge: 61

Wohnort: Dresden

  • Private Nachricht senden

5

13.06.2016, 13:08

Also wenn man ein "normals Objekt" benutzt und get () aufruft bekommt man eine veränderbare Instanz zurück, wenn man jedoch ein const Objekt benutzt und da get () aufruft wird die const Resource& get () const; Funktion aufgerufen ?
cout << "Programmieren muss sein" << endl;

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

13.06.2016, 13:27

In deinem Fall ja. Was oft gemacht wird, sollten sich die beiden Versionen nicht unterscheiden, wird einfach eine Version für const angelegt. Die non-const Version implementiert man nicht. Der Compiler ruft dann aber bei non-const Objekten die const-Version auf. In diese Richtung funktioniert das, anders herum jedoch nicht. Soll heißen, ist eine Funktion nicht const, die Instanz ist aber const, dann kann die Funktion darauf auch nicht aufgerufen werden.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

13.06.2016, 14:05

Nee, also da würftelt Inatrox jetzt Sachen durcheinander. Rückgabetyp und Method-Constness sind verschiedene Dinge!
1) schlechte Variante:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class foo {
  const bar& get();
};
class bar {
  void foobar();
};
const foo f;
const bar& b = f.get(); // get() ist hier nicht erlaubt, weil f const ist, die Methode aber nicht
b.foobar(); // wäre auch nicht erlaubt, weil b const ist, die Methode aber nicht


2) schlechte Variante:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class foo {
  bar& get() const;
};
class bar {
  void foobar();
};
const foo f;
bar& b = f.get(); // get() ist hier immer erlaubt, egal ob f const ist oder nicht, da get selbst const ist.
b.foobar(); // nur erlaubt, weil b nicht const ist!


3) "gute" Variante (sofern get-Methoden überhaupt gut sein können):

C-/C++-Quelltext

1
2
3
4
class foo {
  const bar& get() const; // besser als die anderen Varianten, weil der Inhalt von foo nie verändert wird beim Rufen
                          // dieser Funktion und der Rückgabewert auch nicht manipuliert und nur gelesen werden 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]

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »BlueCobold« (13.06.2016, 14:29)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

13.06.2016, 14:22

Nee, also da würftelt Inatrox jetzt Sachen durcheinander. Rückgabetyp und Method-Constness sind verschiedene Dinge!

Na falsch war es ja nicht was er gesagt hat. In seinem Beispiel trifft const ja entweder auf Funktion und Rückgabetyp zu oder auf keines von beiden. Wobei das ganze ja dann spätestens mit deinem Beispiel klar werden sollte. Da sind die Unterschiede ja noch mal schön zu sehen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

13.06.2016, 14:26

Doch, es war falsch. Der Rückgabetyp ist entweder const oder nicht, total unabhängig davon, auf was für einem Objekt ich das aufrufe. Nur passieren eben verschiedene Dinge: Ich kann den Rückgabewert über const "read only" machen. Und ich kann eine Methode selbst const machen, damit diese auch auf einer const-Variablen aufgerufen werden darf. (bzw. symbolisiert const dem Aufrufer auch, dass er damit nichts am Zustand des Objekts ändert, was ja durchaus sehr nice zu wissen sein 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]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

13.06.2016, 14:42

C-/C++-Quelltext

1
2
3
4
5
class test {
public:
  Resource get(Identifier id);
  const Resource& get(Identifier id) const;
};


C-/C++-Quelltext

1
2
3
4
test t1;
const test t2;
t1.get(0);
t2.get(0);


t1 ist nicht const. Bei t1.get(0); wird die nicht konstante Version aufgerufen welche in diesem Falle auch keine konstante Referenz zurück gibt sondern eine Kopie. Im Falle von t2.get(0); wird die konstante Version der Methode aufgerufen welche in diesem Fall auch eine konstante Referenz zurück gibt.
In diesem Fall also alles richtig.
Aber ja, der Rückgabewert ist nicht konstant weil die Methode dies auch ist sondern weil es extra so definiert wurde. Etwas anderes hat aber auch niemand behauptet und dein Beispiel zeigt das ganze ja noch mal.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige