Fibonacci OOP



  • was macht denn auto_ptr?



  • auto_ptr ist ein sogenannter Smart-Pointer, der eine Besitzübertragungssemantik hat. Das heißt, er übernimmt die Verantwortung für ein Heap-Objekt und zerstört es, wenn er selbst zerstört wird. Wenn man einen auto_ptr kopiert oder zuweist, wird der Besitz und damit die Verantwortung weitergegeben -- es gibt jeweils nur einen auto_ptr, der auf ein bestimmtes Objekt zeigt (wenn man ihn nicht absichtlich falsch anwendet natürlich nur). Näheres erfährst du in jedem C++-Buch.



  • Wo wir gerade bei auto_ptr sind, was passiert bei Funktionsaufrufen mit dem
    Pointer als Argument, wird dann die Gültigkeit an nen auto_ptr übertragen welcher
    nach dem Aufruf nicht mehr lebt?

    Sowas meine ich:

    int main ()
    {
    auto_ptr<string> foo = new String ("bar");
    
    tolle_func (foo); // void toole_func (auto_ptr<string> foo);
    
    foo += "12"; 
    }
    


  • bashar, nur so als frage:

    class Calculator_factory { 
      public: 
        virtual Calculator* create_calculator(int n) = 0; 
        virtual ~Calculator_factory_base() { } 
    };
    

    gibts einen compiler, der die klasse mit dem dtor compiliert?



  • Nö, hab mich verschrieben.

    SirLant: Exakt.



  • @Sirlant: Du weißt aber schon, daß die Fibonacciszahlen exponentiell wachsen und die Anzahl der Funktionsaufrufe in Deiner Version proportional zur zu berechnenden Fibonacci-Zahl sind?



  • Das ist die richtige Lösung 😉

    #include <iostream> 
    using namespace std; 
    template<unsigned i> 
    struct fibonacci { 
      static const unsigned result = fibonacci<i-1>::result + fibonacci<i-2>::result; 
    }; 
    
    template<> 
    struct fibonacci<0> { 
      static const unsigned result = 1; 
    }; 
    
    template<> 
    struct fibonacci<1> { 
      static const unsigned result = 1; 
    };
    int main() { 
      cout << fibonacci<9>::result; 
    }
    

    Copyright von Rainer Baumann



  • Jester schrieb:

    @Sirlant: Du weißt aber schon, daß die Fibonacciszahlen exponentiell wachsen und die Anzahl der Funktionsaufrufe in Deiner Version proportional zur zu berechnenden Fibonacci-Zahl sind?

    Weiß ich, aber so ist es am kürzesten zu schreiben und sollte ja auch nur zeigen,
    wie ich so was schreiben würde.



  • SirLant schrieb:

    ... sollte ja auch nur zeigen,
    wie ich so was schreiben würde.

    Eben, und ich hoffe doch eigentlich, daß Du es iterativ schreiben würdest.



  • @pinguin: Hat aber im Prinzip wenig mit OOP zu tun? Viel eher mit Metaprogrammierung?! Nur weils hier doch um OOP ging 🙂

    MfG SideWinder



  • desert pinguin schrieb:

    Das ist die richtige Lösung 😉

    #include <iostream> 
    using namespace std; 
    template<unsigned i> 
    struct fibonacci { 
      static const unsigned result = fibonacci<i-1>::result + fibonacci<i-2>::result; 
    }; 
    
    template<> 
    struct fibonacci<0> { 
      static const unsigned result = 1; 
    }; 
    
    template<> 
    struct fibonacci<1> { 
      static const unsigned result = 1; 
    };
    int main() { 
      cout << fibonacci<9>::result; 
    }
    

    Copyright von Rainer Baumann

    2 fragen:
    1. wird das hier während des compilieren berechnet?
    2. ist das wirklich der richtige algorithmus? fiboacci war doch
    1,1,2,3,5,8,13...

    //edit aua... hab mich verguckt, die funktion berechnet die Zahl an der 9. stelle der liste oder?^^



  • zu 1. ja
    zu 2.(edit): ja



  • @otze: Falls dich das interessiert google mal nach "Metaprogrammierung" bzw. "Generische Programmierung".

    MfG SideWinder



  • SideWinder schrieb:

    @otze: Falls dich das interessiert google mal nach "Metaprogrammierung" bzw. "Generische Programmierung".

    MfG SideWinder

    da kannste dich drauf verlassen, dass ich danach googlen werde, ich intressiere mich für alle fein(grob)heiten der programmierung 🙂



  • otze schrieb:

    SideWinder schrieb:

    @otze: Falls dich das interessiert google mal nach "Metaprogrammierung" bzw. "Generische Programmierung".

    da kannste dich drauf verlassen, dass ich danach googlen werde, ich intressiere mich für alle fein(grob)heiten der programmierung 🙂

    perfekter einsteig in die metaprogrammierung ist imho Blitz++ und Todd Verhouldsons artikel über expression templates (als link bei Blitz++ angegeben). die expression templates ruhig mal ein wenig nachprogrammieren. danach am besten ein bis zwei jahre lisp oder prolog programmieren. die kluft zwischen den einfachen sachen und den krassen ist schlimm gross. und dann den code von boost lesen.



  • Wenn man die Fibonaccizahlen schon in eine Klasse kapselt wäre das doch ein schönes Beispiel für Memoization, um die Laufzeit im Zaun zu halten.



  • MaSTaH schrieb:

    Wenn man die Fibonaccizahlen schon in eine Klasse kapselt wäre das doch ein schönes Beispiel für Memoization, um die Laufzeit im Zaun zu halten.

    warum nicht iterov oder tail-recursive machen?
    memoization ist für micht nur ne zweitbeste lösung.



  • Jester schrieb:

    SirLant schrieb:

    ... sollte ja auch nur zeigen,
    wie ich so was schreiben würde.

    Eben, und ich hoffe doch eigentlich, daß Du es iterativ schreiben würdest.

    Hälst du mich wirklich für so dumm 😕 😮 🤡 😃 😉

    Klar würd ichs iterativ machen, aber warscheinlicher wäre, dass es es mit der
    Templatemetaprogrammierung lösen würd, weil ich das schon fertig aufm PC hab,
    das andere müsst ich erst schreiben 🙂



  • Nein, ich halte Dich nicht für dumm, deswegen habe ich ja gesagt, ich hoffe, daß Du es iterativ schreiben würdest und nicht, wie Du weiter oben behauptet hast rekursiv.

    Und die template-Lösung scheidet aus:

    int i;
    cin >> i;
    cout << fibonacci(i);
    


  • int i;
    std::cin >> i;
    std::cout << fibonacci<i>::result;
    

Anmelden zum Antworten