000
08.08.2006, 15:58 Uhr
Yadgar
|
High!
Ich nähere mich langsam den C++-Regionen für Fortgeschrittene... mittlerweile bin ich bei Operatorfunktionen, habe gelernt, dass man sie sowohl global als auch als Klassenmethoden definieren kann, und dass bei Vorhandensein beider Varianten mit gleichen Übergabetypen die klassenspezifische Variante gewählt wird.
Soweit die Theorie... nur scheint es in der Praxis nicht immer so zu laufen.
Ich habe hier eine Klasse "Complex", für die ich zum einen + und * als Operatorfunktion definiert habe:
C++: |
class Complex { friend Complex operator + (const Complex& arg1, const Complex& arg2); friend Complex operator * (const Complex& arg1, const Complex& arg2); private: double re, im; public: Complex(); // Standardkonstruktor Complex(double re_in, double im_in); // allgemeiner Konstruktor Complex(const Complex&); // Kopierkonstruktor ~Complex(); // Destruktor void set(double re_in, double im_in); void print(); Complex operator + (const Complex& c2); Complex operator * (const Complex& c2); };
// globale Funktionen
Complex operator + (const Complex& arg1, const Complex& arg2);
Complex operator * (const Complex& arg1, const Complex& arg2);
|
dazu die Definitionen der betreffenden Funktionen:
C++: |
Complex Complex::operator + (const Complex& c2) { cout << "Jetzt verwende ich die klassenspezifische Version des Additionsoperators!" << endl; return Complex(re+c2.re, im+c2.im); }
Complex Complex::operator * (const Complex& c2) { cout << "Jetzt verwende ich die klassenspezifische Version des Multiplikationsoperators!" << endl; return Complex(re*c2.re, im*c2.im); }
|
bzw.
C++: |
Complex operator +(const Complex& arg1, const Complex& arg2) { return Complex(arg1.re + arg2.re, arg1.im + arg2.im); }
Complex operator *(const Complex& arg1, const Complex& arg2) { return Complex(arg1.re * arg2.re, arg1.im * arg2.im); }
|
Trotzdem wird von main() aus
C++: |
int main() { Complex c1(1, 2); Complex c2(2, 3); Complex c3(3, 4); Complex c4(0, 1); Complex c9 = c1 * c2 + c3 * c4; getchar(); }
|
nur die globale Version verwendet! Wieso? Was habe ich falsch gemacht?
Bis bald im Khyberspace!
Yadgar -- Flagmaker - ein Programmier-Blog |