Ergebnis 1 bis 6 von 6

Thema: Friend Funktionen in Komponenten-Funktionen wandeln --Fragen

  1. #1
    HTML Newbie
    Registriert seit
    30.11.2007
    Beiträge
    4
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard Friend Funktionen in Komponenten-Funktionen wandeln --Fragen

    Hallo zusammen

    Für mein Informatik2 Praktikum sollten wir eine Klasse safe_int schreiben, in der Zahlbereichsüberschreitungen während des Rechnes mit Integerzahlen erkannt werden. Dieses Programm habe ich mit viel Unterstützung zum Laufen gekriegt. In der neuen Aufgabe sollen wir die bisher als friend vereibarten Operatorfunktionen in Komponentenfunktionen umwandeln und die Klasse dann noch erweitern. Allerdings habe ich keine Ahnung wie das funktioniert bzw. wie ich das aufschreiben soll. Ich poste mal die Klasse safe_int und eine Operatorfunktion safe_int operator+:

    Code:
    class safe_int{
       private:
          int val;                                     //der eigentliche Zahlwert eines safe_int
          static const string limit_string;    //die max Zahl als String (21474.....)
          static string lim_to_string();       //die Umwandelfunktion für zahl in string
          static int divi(int,int);
          static int mod(int,int);
      
       public: 
          static const int lim;                    //die max Zahl als in (21474......)      
          class overflow {                        //die Fehlerklasse
          	public:
    		int op1,op2;
    		char func[30];
    		overflow(char *f,int i,int j){
    			op1=i;
    			op2=j;
    			strcpy(func,f); 
    		                             }
    	    };//of class overflow 
    
          safe_int(string zahl);                                   //der Stringkonstruktor
          safe_int() throw() {val=0;}                         //der Defaultkonstruktor
          
          friend safe_int operator+(safe_int,safe_int);   //Um diese Funktion geht es!
          friend safe_int operator-(safe_int,safe_int);
          friend safe_int operator*(safe_int,safe_int);
          friend safe_int operator/(safe_int,safe_int);
          friend safe_int operator%(safe_int,safe_int);
          friend ostream& operator<<&#40;ostream&,safe_int&#41;;
          friend istream& operator>>&#40;istream&,safe_int&&#41;;         
    &#125;;
    Und im Anschluss gleich die friend safe_int operator+(safe_int,safe_int) Funktion:

    Code:
    safe_int operator+&#40;safe_int a,safe_int b&#41;&#123;
        safe_int erg;
        if&#40;&#40;b.val>0 && a.val>safe_int&#58;&#58;lim-b.val&#41; || &#40;b.val<0 && -a.val>safe_int&#58;&#58;lim+b.val&#41;&#41;&#123;
           throw safe_int&#58;&#58;overflow&#40;"Addition",a.val,b.val&#41;;       
                                                                          &#125;
        erg.val=a.val+b.val;                                                                  
    return erg;    
    &#125;
    Es wäre super wenn mir jemand diese Operatorfunktion in eine Komponentenfunktion umwandeln könnte. Das geht bestimmt sehr leicht, allerdings haben im Semester aus Krankheitsgründen die Profs gewechselt und der neue ist ein Buch mit sieben Siegeln. Nicht nur für mich

    thx
    Epi
    Achtung: Dies ist ein alter Thread im HTML und Webmaster Forum
    Diese Diskussion ist älter als 90 Tage. Die darin enthaltenen Informationen sind möglicherweise nicht mehr aktuell. Erstelle bitte zu deiner Frage ein neues Thema im Forum !!!!!

  2. #2
    Fortgeschrittene/r
    Registriert seit
    26.09.2005
    Ort
    Nürnberg
    Beiträge
    169
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Also ich werde dir die Aufgabe jetzt nicht lösen, aber hier mal ein paar Tipps:

    1. friend brauchst du bei Memberfunktionen nicht mehr.

    2. du bekommst als Parameter nur noch einen safe_int übergeben, der zweite ist das eigentliche Objekt (this, also dieses Objekt auf dem du dann arbeitest).

    3. gibt immer eine Referenz auf safe_int zurück, damit so was geht:
    Code:
    a = b + c + d; // a,b,c,d sind safe_int
    Ach und ich muss sagen, dass ich das mit dem String-ctor nicht versehe. Warum nicht ein Integer-ctor "safe_int(int zahl);" ? Wäre das nicht sinnvoller?

  3. #3
    HTML Newbie
    Themenstarter

    Registriert seit
    30.11.2007
    Beiträge
    4
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    mit nem Int Konstruktor könnte man mit
    Code:
    int i;
    cin>>i;
    safe_int si&#40;i&#41;;
    für i=300000000000000000 die sichere Eingabe wieder aushebeln. Deswegen ein char oder stringkonstruktor,indem man die Zahl auf gültigkeit überprüft und weil dann safe_int und double/int Verknüpfungen nicht mehr möglich sind, kann man die Operatorfunktionen auch gleich als Member machen. So die offizielle Erklärung. Hab ich ja auch soweit begriffen.

    Die ersten zwei Punkte die du erwähnst verstehe ich auch soweit (mit dem *this muss ich mir nochmal anschauen...hatten wir noch nicht. Alllerdings hab ich das gerade auch irgentwo gelesen.).
    Der dritte Punkt ist mir noch ein Rätsel:
    Das mit dem Referenz zurückgeben habe "ich" ja auch schon beim >>Operator benutzt und da auch nocht nicht kapiert. Warum ist a=b+c+d nur möglich wenn man eine Referenz zurückgibt? hmm...ich les mir das Kapitel mit Referenzen nochmal durch, aber wenn du eine gut verständliche Erklärung kennst wäre ich dankbar.
    Grüße und danke für die Hilfe bislang :thumbsup:

  4. #4
    HTML Newbie
    Themenstarter

    Registriert seit
    30.11.2007
    Beiträge
    4
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Ich hab jetzt schon ein bischen rumgebastelt, allerdings widersetzt sich dieses Problem mir etwas:

    Code:
    safe_int&#58;&#58;safe_int& operator+&#40;safe_int b&#41;&#123;
        safe_int erg;
        if&#40;&#40;b.val>0 && this->val>lim-b.val&#41; || &#40;b.val<0 && -this->val>lim+b.val&#41;&#41;&#123;
           throw overflow&#40;"Addition",this->val,b.val&#41;;       
                                                                          &#125;
        erg=this->val+b.val;                                                                  
    return erg&;    
    &#125;
    Der Compiler meckert, dass man this nicht in einer "non member function" benutzen darf. Also hab ich es noch nichtmal geschafft ihm zu sagen, dass das ein Member sein soll.
    Allerdings habe ich das eigentlich genauso aufgeschrieben wie für den Stringkonstruktor, den ich auch ausserhalb der Klasse definiere:
    Code:
    safe_int&#58;&#58;safe_int&#40;string zahl&#41;&#123;...&#125;
    Und das erkennt er richtig als Member.

    Edit:
    Soo...Fehler gefunden. Es muss (grundsätzlich heißen):
    Code:
    safe_int& safe_int&#58;&#58;operator+&#40;safe_int b&#41;&#123;
        safe_int erg;
        if&#40;&#40;b.val>0 && val>lim-b.val&#41; || &#40;b.val<0 && -val>lim+b.val&#41;&#41;&#123;
           throw overflow&#40;"Addition",val,b.val&#41;;       
        erg.val=val+b.val;                                                                  &#125;                                                                  
    return erg;    
    &#125;
    Allerdings funktioniert die Addition so nicht richtig. safe_int erg ist ja nur eine lokale Variable und Referenzen auf diese zurückgeben ist nicht so sehr sinnvoll. Jetzt muss ich nur noch herausfinden was man hier am besten returned.

    btw: Wen dieses Forenselbstgespräch nervt...einfach nicht beachten

  5. #5
    Fortgeschrittene/r
    Registriert seit
    26.09.2005
    Ort
    Nürnberg
    Beiträge
    169
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Find ich super wie du deine Probleme selbst gelöst hast. Und du hast recht, eine Referenz auf eine lokale Variable ist nicht sinnvoll.

    Deswegen solltest du die Variable erg komplett weglassen, und stattdessen auf dem aktuellen Objekt arbeiten:

    Code:
    safe_int& safe_int&#58;&#58;operator+&#40;safe_int b&#41;
    &#123;
        if&#40;&#40;b.val>0 && val>lim-b.val&#41; || &#40;b.val<0 && -val>lim+b.val&#41;&#41; &#123;
            throw overflow&#40;"Addition",val,b.val&#41;;
        &#125;
        val = val + b.val;
        // oder
        // val += b.val;
        return &#40;*this&#41;;   
    &#125;

  6. #6
    HTML Newbie
    Themenstarter

    Registriert seit
    30.11.2007
    Beiträge
    4
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Perfekt

    Sowas in der Richtung hab ich auch ausprobiert allerdings ist mir n00b
    Code:
    val=val*b.val;
    in die Fehlerabfrage reingerutscht und somit war 10+20 immer 10.:P
    Aber jetzt läufts und die anderen Operatoren werden auch nicht mehr so das Problem sein. Das Wochenende ist gerettet
    Danköööö

Ähnliche Themen

  1. Gültigkeit von Funktionen in Funktionen
    Von thomas69 im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 2
    Letzter Beitrag: 25.05.2007, 16:08
  2. TAL Funktionen
    Von 00eraser00 im Forum Zope & Plone - das deutsche Hilfeforum
    Antworten: 3
    Letzter Beitrag: 11.10.2006, 23:23
  3. PHP Array-Funktionen
    Von minibar182 im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 4
    Letzter Beitrag: 02.07.2006, 15:13
  4. zip funktionen
    Von phore im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 9
    Letzter Beitrag: 29.03.2006, 11:41
  5. Funktionen verbinden
    Von Naeldaven im Forum Flash Forum
    Antworten: 0
    Letzter Beitrag: 14.01.2005, 12:09

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •