Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Programm schreiben, brauch eure Hilfe

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 < [ 3 ] [ 4 ]
010
09.07.2003, 13:21 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
FloSoft postete

C++:
Bruch b1(3,4), b2(3,1), b3;
b3 = b1*b2;


sollte mit dem operator funktionieren, "er" sollte vielleicht noch einen operator welcher normale zahlen als parameter erwartet hinzufügen.



Das ist nicht empfehlenswert. Besser einen geeigneten Constructor bereitstellen und den Operator global machen, weil sonst bekommt man endlos Coderedundanzen. Ausserdem erlaubt der globale Operator die intuitive Schreibweise aus der Originalaufgabenstellung:

C++:
class Bruch
{
    int z;
    int n;
public:
    Bruch(int z_ = 0, int n_ = 1) :z(z_), n(n_) {};

    friend Bruch operator * (const Bruch&, const Bruch&);
};

Bruch operator * (const Bruch& x, const Bruch& y)
{
    return Bruch(x.z*y.z, x.n*y.n);
}

int main()
{
    Bruch x(1,2);
    Bruch y;
    y = 4*x;
}





Zitat:
FloSoft postete
um eine Exception auszulösen kannste einfach folgendes machen:


C++:
Bruch::Bruch(int z, int n)
{
  //...
  if(n == 0)
    throw();
}



Syntaxerror. () ist kein Wert.

edit by FloSoft: Smiley-Fehler rausgemacht
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 09.07.2003 um 15:19 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
09.07.2003, 13:33 Uhr
~0xdeadbeef
Gast


Soweit, so gut. Zunächst mal: Normalerweise spaltet man eine Klasse in zwei Dateien auf - den Header, in dem die Klasse deklariert wird, und die cpp-Datei, in der die Methoden implementiert werden. Wenn dus ander machst, kriegst du bei größeren Programmen Probleme mit dem Linker, weil er dieselbe Methode mehrmals findet und nicht weiß, welche er nehmen soll.

Der Aufbau der Klasse sieht soweit nicht schlecht aus, bis auf eine kleine Ungereimtheit und drei Sachen, die fehlen. Also:

C++:
//bruch.h
#ifndef BRUCH_H  //für den Fall, dass der Header in einer Datei zweimal included wird
#define BRUCH_H

#include <iostream>

using namespace std;

class Bruch {
private:
    int x;
    int y;
public:
    Bruch(void);
    Bruch(int z,int n);

    ~Bruch();
    Bruch operator*(Bruch &) const; //keine Referenz zurückgeben.

    int zaehler() const; //man muss ja von außen auf die Werte zugreifen können.
    int nenner() const;
};

ostream &operator<<(ostream&, Bruch); //für die Ausgabe

#endif


Der operator* ist kein Zuweisungsoperator, *this wird nicht verändert. (Darum hab ich ihn auch const deklariert) Dementsprechend hast du auch kein Objekt, dass du als Referenz zurückgeben könntest und musst ein neues erstellen. Der Operator << ist dazu da, dass du nachher

C++:
Bruch b(2,5);
cout << b << endl;


schreiben kannst. Jetzt die cpp. Der Operator* ist Blödsinn, der Rest sieht OK aus. Allerdings würde ich die Konstruktoren ein bisschen anders schreiben:

C++:
//bruch.cpp
#include <iostream>  //eigentlich nicht mehr nötig, aber übersichtlicher
#include "bruch.h"    //hier steht nämlich #include <iostream> schon drin

using namespace std; //siehe #include <iostream>

Bruch::Bruch(void) : x(1), y(1) { }
Bruch::Bruch(int z,int n) : x(z), y(n) {}

Bruch::~Bruch(){}

int Bruch::zaehler() const { return x; }
int Bruch::nenner() const { return y; }

/* Ich erstelle ein neues Bruch-Objekt, dass mit den Ergebniswerten der
* Multiplikation initialisiert wird. Das gebe ich dann zurück.
*/

Bruch Bruch::operator*(Bruch &c) const {
  return Bruch(x*c.zaehler(), y*c.nenner());
}

/* Den Bruch in Einzelteilen in den Stream schreiben.
*/

ostream &operator<<(ostream &os, Bruch b) {
  os << b.zaehler() << '/' << b.nenner();
  return os;
}


Alles klar?
edit by FloSoft: ebenfalls Smiley-Fehler rausgemacht

Dieser Post wurde am 09.07.2003 um 15:20 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
09.07.2003, 13:35 Uhr
~0xdeadbeef
Gast


Bah, da nehm ich mir ne Viertelstunde, um den Code zu kommentieren, und schon haben drei Leute Zeug gepostet, an das ich nicht gedacht habe. Die Welt ist schnellebig...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
09.07.2003, 14:04 Uhr
~dj-union
Gast


Hi!

Vielen vielen Dank für eure Antworten!
Sieht ja mal ziemlich logisch aus...

Allerdings motzt der Compiler weil die Operator-Funktion nicht global deklariert ist und wegen überladener Member-Funktion...

CPP-Datei:

C++:
#include <iostream>  //eigentlich nicht mehr nötig, aber übersichtlicher
#include "bruch.h"    //hier steht nämlich #include <iostream> schon drin

using namespace std; //siehe #include <iostream>

Bruch::Bruch(void) : x(1), y(1) { }
Bruch::Bruch(int z,int n) : x(z), y(n) {}

Bruch::~Bruch(){}

int Bruch::zaehler() const { return x; }
int Bruch::nenner() const { return y; }

/* Ich erstelle ein neues Bruch-Objekt, dass mit den Ergebniswerten der
* Multiplikation initialisiert wird. Das gebe ich dann zurück.
*/

Bruch Bruch::operator*(Bruch &c) const {
  return Bruch(x*c.zaehler(), y*c.nenner());
}

/* Den Bruch in Einzelteilen in den Stream schreiben.
*/

ostream &operator<<(ostream &os, Bruch b2) {
  os << b2.zaehler() << '/' << b2.nenner();
  return os;
}

main()
{
    Bruch b1(3,4);
    Bruch b2;
    b2 = 3*b1;    // 3/4 * 3 => Ausgabe: 9/4
    cout << b2;

    return 0;
}




Header-Datei:

C++:
#ifndef BRUCH_H  //für den Fall, dass der Header in einer Datei zweimal included wird
#define BRUCH_H

#include <iostream>

using namespace std;

class Bruch {
private:
    int x;
    int y;
public:
    Bruch(void);
    Bruch(int z,int n);

    ~Bruch();
    Bruch operator*(Bruch &  const); //keine Referenz zurückgeben.

    int zaehler() const; //man muss ja von außen auf die Werte zugreifen können.
    int nenner() const;
};

ostream &operator<<(ostream&, Bruch); //für die Ausgabe

#endif




Wo liegt denn jetzt der Fehler begraben? Find ihn nicht...

Mfg, dj-union

[quote]
Bitte "code"- oder "cpp"-Tags verwenden! ao

Dieser Post wurde am 09.07.2003 um 14:08 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
09.07.2003, 14:09 Uhr
~xyzungelöst
Gast


@dj-union:
kannst du deinen code in tags setzten?

also so "
C++:
" am anfang, dann der code und am ende "
"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
09.07.2003, 14:10 Uhr
virtual
Sexiest Bit alive
(Operator)


Im header das const hinter die Klammer zuiehen, beim op*.
Du wirst wie gesagt so wie es jetzt ist, nicht umhinkommen, main zuverändern. Die notwendige Änderung ist weiter oben im Thread beschrieben
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
09.07.2003, 15:20 Uhr
~dj-union
Gast


Hi virtual!

Deine letzte Antwort hab ich jetzt nicht verstanden...
Laut Aufgabenstellung darf man die main-Funktion nicht verändern...
Gibt es wirklich keine andere Lösung?

Mfg, dj-union
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
09.07.2003, 15:24 Uhr
virtual
Sexiest Bit alive
(Operator)


Doch, klar geht das, nur eben nicht so, wie Du es in Deinem letzten Post gemacht hast. Schau mal das erste Post auf der 2. Seite dieses Threads. Da habe ich beschrieben, wie es geht.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
09.07.2003, 15:26 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ups mit dem throw hab ich mist gebaut, es muss natürlich lauten


C++:
if(n == 0)
  throw "Division by Zero";


Hatte nicht nachgeschaut :P

Das mit dem Operator war auch nicht ausprobiert und gut genug überlegt, war einfach das was mir dazu so "zwischen Tür und Angel" eingefallen ist...
--
class God : public ChuckNorris { };

Dieser Post wurde am 09.07.2003 um 15:27 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
09.07.2003, 17:45 Uhr
~dj-union
Gast


Hi Leute!

Wir sind jetzt soweit:

Bruch.h:

C++:
#ifndef BRUCH_H  //für den Fall, dass der Header in einer Datei zweimal included wird
#define BRUCH_H

#include <iostream>

using namespace std;

class Bruch {
private:
    int x;
    int y;
public:
    Bruch(void);
    Bruch(int z,int n);

    ~Bruch();

    int zaehler() const; //man muss ja von außen auf die Werte zugreifen können.
    int nenner() const;

    friend Bruch operator* (const Bruch &b1, const Bruch &b2);
};


ostream &operator<<(ostream&, Bruch); //für die Ausgabe

#endif


Bruch.cpp:

C++:
#include <iostream>

using namespace std;

Bruch::Bruch(void) : x(1), y(1) { }
Bruch::Bruch(int z,int n) : x(z), y(n) { }

Bruch::~Bruch() {}

int Bruch::zaehler() const { return x; }
int Bruch::nenner() const { return y; }


inline Bruch operator*(const Bruch &b1, const Bruch &b2)
{
  return Bruch(b1.zaehler()*b2.zaehler(), b1.nenner()*b2.nenner());
}

ostream &operator<<(ostream &os, Bruch b) {
  os << b.zaehler() << '/' << b.nenner();
  return os;
}

main()
{
    Bruch b1(3,4);
    Bruch b2;
    b2 = 3*b1;    // 3/4 * 3 => Ausgabe: 9/4
    cout << b2;

    return 0;
}




Irgendwie ist da wohl ein Denkfehler drin, weil es nicht läuft...
Hat jemand eine Idee???

Mfg, dj-union

Dieser Post wurde am 09.07.2003 um 17:59 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]     [ 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: