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

1

26.07.2013, 23:05

Array-Operatoren

Hallo,

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<class T>
class Vec3 {
public:
  // values
  T x,y,z;

  ...

  // returns i-th komponent (i=0,1,2) (RHS array operator)
  const T operator[] (unsigned int i) const {
    return *(&x+i);
  }
  // LHS array operator
  T & operator [] (unsigned int i) {
    return *(&x+i);
  }
}


woher weiß der Compiler bei diesen beiden Operatoren denn, wann welcher zur Anwendung kommt? Könnte der untere nicht auch noch konstant sein? Der Aufruf verändert ja keine members..

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

26.07.2013, 23:08

Der Compiler wird die erste Version nehmen so lange er kann. Ansonsten nimmt er dann den zweiten. Aus dem jeweiligen Kontext ist klar welche Funktion zur Anwendung kommt.

//Edit
An sich sind die Methoden schon Mehrdeutig, aber darum implementiert man die Methoden so, dass bei jedem Einsatz der ersten Variante das gleiche herauskommt, wenn die zweite Variante genommen wird. Umgekehrt ist das ja nicht immer möglich.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

27.07.2013, 00:22

Der untere gibt aber Zugriff auf den jeweiligen Member und erlaubt potentiell, diesen zu verändern. logical vs. binary const... ;)

4

27.07.2013, 00:52

Übrigens:
const T& operator[] (unsigned int i) const
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

27.07.2013, 00:53

Wieso? Ich würde eher argumentieren, dass das const dort überflüssig ist... ;)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

27.07.2013, 01:55

Welches const soll überflüssig sein?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

27.07.2013, 02:11

C-/C++-Quelltext

1
2
const T operator[] (unsigned int i) const
  ^ das hier ;)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

27.07.2013, 03:33

ja, wenn es als Kopie zurückgegeben wird stimmt das, aber das ist doch nicht der Sinn der Sache oder?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

27.07.2013, 09:08

Naja, hier keine Kopie zurückzugeben macht nur Sinn, wenn T ein komplexer Typ ist, was aber wohl nicht wirklich dem angedachten Einsatzzweck entspricht. Ansonsten könnte das eher zu ineffizientem Code führen. Aber genaugenommen ist das Beispiel da oben sowieso undefiniertes Verhalten, denn einfach so Pointerarithmetik auf den Membern eines struct betreiben, ist leider kein von Standard C++ unterstütztes Vorgehen...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

27.07.2013, 10:02

Das mit den Pointern bereitet mir persönlich die größten Schmerzen. Bei hübschem Alignment geht gar nichts mehr und den Fehler zu finden macht in einem großen Projekt richtig Freude.
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]

Werbeanzeige