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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

05.02.2014, 20:59

Jo, passende Fälle, wo es Sinn macht, kann man ganz eindeutig konstruieren. Aber um die geht es nicht in der Frage.
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]

12

05.02.2014, 21:46

Es ist vermutlich wirklich eher eine philosophische Frage. Subjektiv verwende ich immer öfter freie Funktionen; zumal C++ operator-overloading unterstützt. Gerade bei Infix-Operationen greife ich nahezu ausschließlich auf globale Funktionen zurück.

Technisch gesehen, wenn es kein großer Aufwand ist, verwendete ich freie Funktionen. Wenn man diese jedoch erstmal friend deklarieren müsste oder ein zusätzliche Methoden bereitstellen müsste, damit ich auf Gleichheit prüfen könnte, sähe ich davon ab und stellte eine entsprechende Methode zur Verfügung.

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

05.02.2014, 21:54

Also macht man das, weil man das so macht. Auch wenn's eigentlich für Kapselung kontraproduktiv ist. Weird.
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

14

05.02.2014, 22:12

Wieso ist es deiner Meinung nach für die Kapselung kontraproduktiv? Hier nochmal der Link von vorhin: http://www.drdobbs.com/cpp/how-non-membe…capsu/184401197

Abgesehen davon haben freie Funktionen auch Vorteile bezüglich Flexibilität wenn es in Richtung Templates geht, da man nicht auf benutzerdefinerte Typen beschränkt ist, wie es mit Methoden der Fall wäre...

15

05.02.2014, 22:19

Was den Compiler in gewissen Situationen aber auch schnell verwirren kann. @globale_operatoren_und_templates

MfG
Check

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

05.02.2014, 22:28

Was den Compiler in gewissen Situationen aber auch schnell verwirren kann. @globale_operatoren_und_templates

Was genau meinst du damit?

Wie gesagt Dot der nutzen ist mir vollkommen klar. Ich möchte aber weg von Fallbeispielen wie..

C-/C++-Quelltext

1
2
3
std::string operator+ (const char* lh, const std::string& rh);
// oder
Vector2D operator* (const int lh, const Vector2D& rh);

hinzu

C-/C++-Quelltext

1
2
3
4
// um mal beim Vector zu bleiben
Vector2D operator* (const Vector2D& lh, const Vector2D& rh);
// oder
bool operator< (const Vector2D& lh, const Vector2D& rh);


Also warum hat diese Implementierung Vorteile gegenüber der Methode als Member-Funktion

C-/C++-Quelltext

1
2
3
Vector2D Vector2D::operator* (const Vector2D& rh);
// oder
bool Vector2D::operator< (const Vector2D& rh);


Ist es nur ein Philosophische frage oder hat es einen greifbaren technischen Vorteil?

Wie gesagt: Die Variante mit freien Funktionen unterstützt automatisch auch int + Vector2D, sobald Vector2D einen Konstruktor anbietet, der einen int nimmt, du brauchst nicht für alle möglichen Kombinationen separate Operatoren schreiben, alles funktioniert auf völlig natürlich Art und Weise von selbst und vor allem symmetrisch. Die Variante mit Memberfunktionen dagegen kann int + Vector2D rein prinzipiell nicht behandeln, nur Vector2D + int. Falls es immer noch nicht klar ist, hier noch ein Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
struct blub
{
  blub(int x = 0) {}
  
  blub operator +(const blub& b)
  {
    return blub();
  }
};

/*blub operator +(const blub& a, const blub& b)
{
  return blub();
}*/

int main()
{
  blub a;
  blub b;

  a + b;  // geht

  a + 5;  // geht auch
  
  5 + b;  // geht nicht mit Memberfunktion; geht aber sehr wohl mit dem oben auskommentierten operator + als freie Funktion...
}

17

05.02.2014, 22:42

Wenn der Konstruktor auch Templates will unds keine andere Möglichkeit gibt.
z.B.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<typename T>
class A
{
public:
    A(const T& _a, const T& _b);
    …
};
template<typename T>
const A<T> operator+(const A<T>& l, const A<T>& r) { … }

void foo()
{
    A<int> a(2, 3);
    A<int> b = a * 2; //Knackpunkt [durch Edit eingefügt]
}

In so einem Fall muss man die Funktion als MemberFriend implementieren und das auch direkt definieren... Obiges Beispiel kompiliert nicht.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
template<typename T>
class A
{
public:
    A(const T& _a, const T& _b);

    friend const A operator+(const A& l, const A& r) { … }
};


MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (05.02.2014, 22:58)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

05.02.2014, 22:44

Das ist aber ein freie Funktion und kein Member. Wobei ich dir recht gebe, ich persönlich betrachte friends auch als eine Art Member. Nur hier geht's um etwas anderes... ;)

Außerdem kompiliert das bei mir sehr wohl... ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (05.02.2014, 22:49)


19

05.02.2014, 22:56

Wenn man ihn beginnt anzuwenden und evtl. auch ausreizt nicht mehr, was ich nun angefügt habe. :whistling:

MfG
Check

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

20

05.02.2014, 23:21

Wenn man ihn beginnt anzuwenden und evtl. auch ausreizt nicht mehr, was ich nun angefügt habe. :whistling:

Nun, ich würde selbst hier auch auf jeden Fall mit friend arbeiten. Hintergrund dafür ist, dass in der Variante ohne friend eine Instanzierung des Klassentemplate A nicht auch eine Instanzierung des operator + Template erzwingt, weshalb der Compiler dann keinen passenden operator + findet. Aus diesem Grund ist es in der Tat zu empfehlen, im Falle von Templates mit friend zu arbeiten, so wie du es in deinem Beispiel gezeigt hast. Hat aber wie gesagt nichts mit der Frage zu tun, wieso man nun freie Funktionen verwenden soll, denn egal ob mit oder ohne friend, beides ist eine freie Funktion... ;)

Werbeanzeige