tutorials.de Buch-Aktion 02/2012
Like Tree3Danke
  • 1 Beitrag von vfl_freak
  • 1 Beitrag von Crash Kid
  • 1 Beitrag von deepthroat
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
820
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von mrs_schokokeks
    mrs_schokokeks mrs_schokokeks ist offline Mitglied
    Registriert seit
    Aug 2010
    Beiträge
    10
    Hi, also die Aufgabe lautet:

    Die Anweisungen:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Bruch a( 5 );
    Bruch b( 1, 2 );
    Bruch c( 1, 4 );
    Bruch d( 115, -391 );
    Bruch e( -37*234, -37*432 );
    cout << a << b << c << d << e << endl;
    cout << b + c << endl;
    cout << 8 + e << endl;
    cout << d * e << endl;

    erzeugen die Ausgabe:

    5/1 1/2 1/4 -5/17 13/24
    3/4
    205/24
    -65/408


    Dazu habe ich folgende Lösung:

    Code :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    
     
    class Bruch
    {private:
    int z;
    int n;
     
     
    public:
    class BruchExceptionNennerNull {};
     
    Bruch( int zaehler, int nenner = 1 ) 
    {
    if(nenner == 0)
    throw BruchExceptionNennerNull();
    z = zaehler;
    n = nenner;
     
    if( n < 0 )
    {
    z = -z;
    n = -n;
    }
     
    }
     
     
    friend ostream& operator<<(ostream& os, const Bruch& br);
     
     
    friend Bruch operator+( const Bruch& links, const Bruch& rechts);
     
     
    Bruch operator*(const Bruch& rechts)
     
    {
    return Bruch( z * rechts.z, n * rechts.n);
    }
    };
     
     
     
    ostream& operator<<(ostream& os, const Bruch& br)
    {
    return os << br.z << "/" << br.n << " ";
    }
    Bruch operator+(const Bruch& links, const Bruch& rechts)
    {
    return Bruch( links.z * rechts.n + rechts.z * links.n,
    links.n * rechts.n );
    }



    Ich verstehe nicht, wann man "friend", "const" und "&" verwenden soll!



    Und hier sind Auszüge aus einem anderen Programm:


    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
     
    class Hms
    {
        private: 
            long t;
     
     
        public:
     
    Hms& operator++(Hms &obj)   
    {
        obj.t++;
        return obj;                             
    }
    };

    Hier wird "&" vor "operator" verwendet.

    Und bei

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
     
    class Hms
    {
        private: 
            long t;
     
        public:
    friend Hms operator+(long s, const Hms &obj)
    {
        Hms tmp( (s + obj.t) );
     
        return tmp;
     
    }
    };

    steht kein "&".

    Ok, es ist vielleicht hier nicht ganz klar, wozu die gut sind aber es gibt ja bestimmte Fälle, wo "friend", "const" und "&" geschrieben werden müssen. Und die kann ich irgendwie nicht unterscheiden und bin immer wieder aufs Neue verwirrt...
    Hoffentlich könnt ihr mir das ganz klar und einfach erklären!
    Danke!
     

  2. #2
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.098
    Moin,

    Zitat Zitat von mrs_schokokeks Beitrag anzeigen
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    class Hms
    {
        private: 
            long t;
     
        public:
    friend Hms operator+(long s, const Hms &obj)
    {
        Hms tmp( (s + obj.t) );
     
        return tmp;
     
    }
    };
    steht kein "&".
    Doch: const Hms &obj .... Zeile 7 .....

    Zitat Zitat von mrs_schokokeks Beitrag anzeigen
    Ok, es ist vielleicht hier nicht ganz klar, wozu die gut sind aber es gibt ja bestimmte Fälle, wo "friend", "const" und "&" geschrieben werden müssen. Und die kann ich irgendwie nicht unterscheiden und bin immer wieder aufs Neue verwirrt...
    Hoffentlich könnt ihr mir das ganz klar und einfach erklären!
    Danke!
    zu "friend":
    Code cpp:
    1
    2
    3
    4
    5
    6
    
    friend Klassenname;
    friend Funktionsdeklarator;
    Dieses Schlüsselwort teilt dem Compiler mit, daß eine Funktion oder Klasse Zugriff auf die als private oder protected deklarierten Elemente der eigenen Klasse hat.
     
    Eine Klasse, bei der sämtliche Methoden Zugriff auf die Elemente einer anderen Klasse haben, wird als Friend-Klasse bezeichnet.
    Friend-Klassen müssen innerhalb der Klasse als solche deklariert werden, die Zugriff auf ihre Elemente gewährt

    Das Schlüsselwort const wird verwendet, um Konstanten (schreibgeschützte Werte) zu erzeugen. Nach der Initialisierung kann eine Konstante nicht mehr verändert aber wie eine Variable gelesen werden.

    Google mal einfach nach dem Begriffen oder schau in ein C++-Buch, da sind diese Grundlagen alle lang und breit erklärt

    Gruß
    Klaus
    mrs_schokokeks bedankt sich. 
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  3. #3
    Avatar von mrs_schokokeks
    mrs_schokokeks mrs_schokokeks ist offline Mitglied
    Registriert seit
    Aug 2010
    Beiträge
    10
    Danke für die Antwort!

    Ich meinte, kein "&" vor "operator+":

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
     
    class Hms
    {
        private: 
            long t;
     
        public:
    friend Hms operator+(long s, const Hms &obj)  // nicht friend Hms& operator+(long s,  const Hms &obj) !
     
    {
        Hms tmp( (s + obj.t) );
     
        return tmp;
     
    }
    };

    Und was bedeutet das & in der Klammer bei (const Hms &obj)?

    Hab mich schon fast totgegoogelt, aber z.B. bei der ersten Aufgabe:

    friend Bruch operator+( const Bruch& links, const Bruch& rechts);
    Bruch operator*(const Bruch& rechts);

    Wieso bei einem friend und bei anderem nicht? Bruch operator* greift doch auch auf private member zu?

     

  4. #4
    Crash Kid Crash Kid ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    144
    Hey,

    unter diesem Link wird alles über C++ erklärt. Auch das überladen von Operatoren ist enthalten.
    Vllt hilft es dir...

    http://www.highscore.de/cpp/aufbau/index.html

    gruß
    mrs_schokokeks bedankt sich. 
    Wenn meine Antwort nützlich bzw. hilfreich war, würde ich mich sehr über eine Bewertung bzw. ein Danke sehr freuen.

    Danke euch


    Programmiere in C, C++ auf Windows XP, Vista und Windows 7
    Spezialisiert auf Netzwerkprogrammierung, WinAPI uvm.

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.983
    Hi.
    Zitat Zitat von mrs_schokokeks Beitrag anzeigen
    Ich meinte, kein "&" vor "operator+":

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
     
    class Hms
    {
        private: 
            long t;
     
        public:
    friend Hms operator+(long s, const Hms &obj)  // nicht friend Hms& operator+(long s,  const Hms &obj) !
     
    {
        Hms tmp( (s + obj.t) );
     
        return tmp;
     
    }
    };

    Und was bedeutet das & in der Klammer bei (const Hms &obj)?
    Das & bedeutet, dass obj eine Referenz auf ein Hms ist. "Referenztypen c++"


    Zitat Zitat von mrs_schokokeks Beitrag anzeigen
    friend Bruch operator+( const Bruch& links, const Bruch& rechts);
    Bruch operator*(const Bruch& rechts);

    Wieso bei einem friend und bei anderem nicht? Bruch operator* greift doch auch auf private member zu?
    Der entscheidende Unterschied ist, dass operator* eine Memberfunktion (sprich: Methode) ist, und operator+ nicht. Deshalb kann operator+ auch nicht auf private oder protected Member zugreifen.

    Eigentlich ist diese Schreibweise auch etwas ungewöhnlich, normalerweise verwendet man es so:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    class A {
      int m_value;
    public:
      friend A operator+(const A&, const A&);
    };
     
    A operator+(const A& x, const A& y) {
      std::cout << x.m_value; // OK: ist ein Freund von A
    }
    Der operator+ hat im Grunde gar nichts mit der Klasse zu tun, außer dass eine "Freundschaft" zwischen der Klasse und dem Operator besteht.

    \edit: Bzgl. deiner Frage warum der Operator ein B und kein B& zurückgibt: eine Funktion kann nur eine Referenz zurückgeben wenn bereits ein Objekt existiert, der Operator erzeugt aber ein neues Objekt (das Ergebnis der "Addition" von 2 A:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    A f1() {
      A a;
      return a; // OK: ein neues A
    }
     
    A& f2() {
      A a;
      return a; // ERROR: gibt eine Referenz auf ein lokales Objekt zurück (führt zum Absturz)
    }
     
    A& f3() {
      A* a = new A();
      return *a; // ERROR: gibt eine Referenz auf ein dyn. erzeugtes Objekt zurück (Speicherleck)
    }
    Konstante Referenzen als Parameter verwendet man immer dann, wenn innerhalb der Methode oder Funktion der Parameter nicht verändert wird. Das hat den Vorteil, das man auch temporäre Objekte übergeben kann:
    Code cpp:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    
    class B {
      int m_value;
    public:
      B(int i) : m_value(i);
      void set_value(int v) { m_value = v; }
    };
     
    void f1(B& x) {
      x.set_value(1); // OK
    }
     
    void f2(const B& x) {
      x.set_value(2); // ERROR: x ist konstant!
    }
     
    void f3(B x) {
      x.set_value(3); // OK
    }
     
    int main() {
      B b;
      b.set_value(-1);
     
      f1(b); // OK
      // b.m_value ist jetzt == 1
      f1(33); // ERROR
     
      f2(b); // OK
      f2(33); // OK (erzeugt temporäres B über Konstruktor)
     
      f3(b); // OK, aber erzeugt Kopie von B (ineffizient!)
      // b.m_value ist immer noch == 1
      f3(33); // OK
    }
    Gruß
    Geändert von deepthroat (25.08.10 um 19:25 Uhr)
    mrs_schokokeks bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Eingabe in der timeline: "time*100" - bei Effekt "turbulentes Versetzen"-"Evolution"
    Von MTMonline im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 2
    Letzter Beitrag: 25.04.08, 09:49
  2. Antworten: 6
    Letzter Beitrag: 20.04.07, 17:39
  3. Antworten: 3
    Letzter Beitrag: 26.12.06, 23:52
  4. Finder methods + JBoss + Was expecting one of: "CONCAT" "SUBSTRING" ... "(" ... <STRI
    Von cengizhdde im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 6
    Letzter Beitrag: 27.05.05, 15:29
  5. Antworten: 2
    Letzter Beitrag: 19.05.05, 19:51

Stichworte