Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Priorität bei Operatorfunktionen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.08.2006, 16:39 Uhr
~Blubber2063
Gast


Hab dein Programm so compiliert, Konstruktoren und Destruktoren natürlich noch geschrieben:

Folgende Ausgabe:
Jetzt verwende ich die klassenspezifische Version des Multiplikationsoperators!
Jetzt verwende ich die klassenspezifische Version des Multiplikationsoperators!
Jetzt verwende ich die klassenspezifische Version des Additionsoperators!

Also wo ist dein Problem. Läuft doch richtig, btw, gib Referenzen auf das *this zurück, wenn du den Operator nicht const deklarierst. Und gib ne Referenz auf deine dynamischen erzeugten Ergebnisobjekte zurück, oder nen Zeiger, call by value mit Objekten ist nicht so toll.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.08.2006, 17:09 Uhr
~Blubber2063
Gast


Achso und nur der Korrektheit halber, die multiplikation für Complexe Zahlen geht anders nämlich soa,b)*(c,d)=(a*c-b*d,a*d+b*c )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.08.2006, 09:32 Uhr
Yadgar



High!


Zitat von ~Blubber2063:

Folgende Ausgabe:
Jetzt verwende ich die klassenspezifische Version des Multiplikationsoperators!
Jetzt verwende ich die klassenspezifische Version des Multiplikationsoperators!
Jetzt verwende ich die klassenspezifische Version des Additionsoperators!

Also wo ist dein Problem. Läuft doch richtig, btw, gib Referenzen auf das *this zurück, wenn du den Operator nicht const deklarierst. Und gib ne Referenz auf deine dynamischen erzeugten Ergebnisobjekte zurück, oder nen Zeiger, call by value mit Objekten ist nicht so toll.


Komisch, bei mir nicht... eventuell stimmt was mit meinen Konstruktoren bzw. dem Destruktor nicht?

Hier der zusätzliche Code:


C++:
Complex::Complex(){}

Complex::Complex (double re_in, double im_in)
{
   re=re_in;
   im=im_in;
   print();
}

Complex::Complex(const Complex& c_in)
{
   re=c_in.re;
   im=c_in.im;
   print();
}

void Complex::print(void)
{
   cout << "(" << re << ", " << im << ")";
}



und der Destruktor:


C++:
Complex::~Complex()
{
   cout << "Objekt wird zerst" << (char)148 << "rt!" << endl;
}



Ach ja, und was die Formel für die Addition komplexer Zahlen angeht: ich weiß nicht einmal, was komplexe Zahlen überhaupt sind (das kam im Mathe-Grundkurs damals auf meinem nordrhein-westfälischen Vorstadt-Brettergymnasium einfach nicht vor!), ich habe einfach den Algorithmus aus dem C++-Lehrbuch (Martin Aupperle, Die Kunst der Programmierung in C++, Braunschweig/Wiesbaden 2002) übernommen... ich ahne schon, ohne höhere Mathematik tut man sich als Progger ziemlich schwer!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.08.2006, 12:15 Uhr
~Blubber2063
Gast


Naja zum testen ist das völlig egal ob deine Brechnung stimmt, aber du hast schon recht nicht umsonst wird man im Grundstudium Informatik min. die hälfte der Zeit mit Mathe belangt . Also ich tippe bei deinem Fehler eher darauf das dein Compiler schuld ist. Bis auf deine speziellen Ausgabe sehen meine Konstruktoren und Destruktoren genauso aus. Also ich hab das mit MinGW mit allen Optimierungen compiliert und mit Open Watcom, sowie dem Visual Studio .net c++ Compiler getestet überall das selbe Ergebnis. Ich denke das sich dein Compiler vermutlich nicht standard Konform verhält, bzw. evtl nicht ansi(iso) c++ compiliert, kannst ja mal probieren ob sich was ändert wenn du mit -ansi, bzw. -iso compilierst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.08.2006, 13:04 Uhr
ao

(Operator)



Zitat von Yadgar:
komplexe Zahlen (das kam im Mathe-Grundkurs damals auf meinem nordrhein-westfälischen Vorstadt-Brettergymnasium einfach nicht vor!)

Da gehört es auch nicht hin. Aber im ersten Semester läuft es dir unweigerlich über den Weg, wenn du irgendwas Natur- oder Ingenieurwissenschaftliches studierst, egal ob Uni oder FH.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.08.2006, 14:12 Uhr
Yadgar



High!


Zitat von ~Blubber2063:
Naja zum testen ist das völlig egal ob deine Brechnung stimmt, aber du hast schon recht nicht umsonst wird man im Grundstudium Informatik min. die hälfte der Zeit mit Mathe belangt .


Das hier ist (leider?) kein Informatik-Studium, sondern eine berufliche Fortbildung in C++, Java und SQL... und größtenteils läuft es auf autodidaktisches Büffeln hinaus! Mathe? Fehlanzeige! Welche Lehrbücher wären da zu empfehlen?



Zitat von ~Blubber2063:

kannst ja mal probieren ob sich was ändert wenn du mit -ansi, bzw. -iso compilierst.


Bingo! Das war's... offensichtlich ist gcc in der Standardeinstellung nicht ANSI-konform! Danke, Blubber2063 (ist das 'ne Science-Fiction-Wasserpfeife? Oder schleppst du 2063 Kilo Walspeck mit dir rum?)!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.08.2006, 14:36 Uhr
ao

(Operator)



Zitat von Yadgar:
Mathe? Fehlanzeige! Welche Lehrbücher wären da zu empfehlen?

Gar keine. Das ist nur ein Beispiel. Nicht nötig, sich zum Experten zu machen. Operator-Überladung kannst du genausogut an einer Klasse Bruch üben.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.08.2006, 15:09 Uhr
~Blubber2063
Gast


Hmmm, naja also bei mir funktionierte es beim mingw auch ohne -ansi, habs jetzt nicht mit dem original g++ getestet, aber eigentlich ist mingw ja nur eine Portierung, vielleicht ist deine g++ version auch etwas älter, aber gut wenn das Problem gelöst ist, ist das ja auch egal.

Wegen Mathe, solange du jetzt nicht ein mathematisches Problem lösen musst, würde ich mir das nicht antun. Es reicht wie ao gesagt hat, zum lernen einfache sachen zu machen. Wenn du mal was mathematisches progn. must reicht es auch wenn du dich dann schlau machst.

Das 2063 ist nur ein anhängsel, weil ich sichergehen wollte das es den Benutzernamen noch nicht gibt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.08.2006, 14:18 Uhr
Yadgar



High!


Zitat von ~Blubber2063:
Wegen Mathe, solange du jetzt nicht ein mathematisches Problem lösen musst, würde ich mir das nicht antun. Es reicht wie ao gesagt hat, zum lernen einfache sachen zu machen. Wenn du mal was mathematisches progn. must reicht es auch wenn du dich dann schlau machst.


...über kurz oder lang werde ich aber da nicht drumrum kommen... meine spezifischen Programmierinteressen gehen ziemlich klar in Richtig Grafik, Animation, 3D (bis hin zu Raytracing, womit ich jetzt durchaus auch das Programmieren von Raytracing-Software meine, nicht bloß deren Anwendung!), geographische Anwendungen, da sollte man sattelfest z. B. in Geometrie, auch analytischer Geometrie sein!

Ich bin (bislang nur hobbymäßig) auch seit Jahr und Tag mit PoV-Ray zugange und bewundere die Cracks, die mit den Äquipotenzialfunktionen jonglieren, als wären sie schon mit einem Multipipeline-Koprozessor auf die Welt gekommen!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: