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...
}
|