Problem mit Ableitung



  • Hallo,

    ich bin gerade dabei, mich in C++ einzulernen und habe irgendwie einen Knopf im Kopf ­čÖé

    Ich habe folgenden Code und finde den Fehler nicht:

    #include <queue>
    #include <iostream>
    
    using std::cout;
    using std::endl;
    using std::string;
    using std::queue;
    
    class A {
      int my_i;
      string my_s;
    public:
      A(int i, string s) :my_i(i), my_s(s)  {}
      virtual int get_my_i() { return my_i; };
      virtual string get_my_s() { return my_s; };
      virtual void do_it() { std::cout << "do A:(" << my_i << ") "<< my_s << std::endl; };
    };
    
    class B {
    
    public:
      B(){}
      void fetch();
      void add(A* a) {
        cout << "Add: " << a->get_my_s() << endl;
        q.push(a);
      };
      std::queue<A*> q;
    };
    
    void B::fetch() {
      while (!q.empty()) {
        A* b_next = q.front();
        q.pop();
        b_next->do_it();
      };
    };
    
    class C : public A {
      int my_i;
      string my_s;
    public:
      C(int i, string s) :A(i, "from C"), my_i(i), my_s(s) {}
      virtual int get_my_i() { return my_i; };
      virtual string get_my_s() { return my_s; };
      virtual void do_it() { cout << "do C:(" << my_i << ") " << my_s << std::endl;
      };
    };
    
    class D : public A {
      int my_i;
      string my_s;
    public:
      D(int i, string s) :A(i, "from D" ), my_i(i), my_s(s) {}
      virtual int get_my_i() { return my_i; };
      virtual string get_my_s() { return my_s; };
      virtual void do_it() { 
        cout << "do D (" << my_i << ") " << my_s << std::endl;
        B call_me;
        call_me.add(new C(4, "C from inside_D"));
        call_me.add(new D(5, "D from inside_D"));
      };
    };
    
    int main() {
      B call_me;
      call_me.add(new A(1,"call A"));
      call_me.add(new C(2,"call C"));
      call_me.add(new D(3, "call D"));
      call_me.add(new C(6, "call C"));
      call_me.fetch();
    };
    

    Vielleicht kann mir wer sagen, wo ich hier den kompletten Denkfehler habe?

    danke
    lg



  • @Uadan sagte in Problem mit Ableitung:

    Ich habe folgenden Code und finde den Fehler nicht:

    Das Programm kompiliert. Was erwartest du, was es ausgeben soll, was es nicht ausgibt?

    Ich h├Ątte allerdings ein paar Kommentare:

    1. new - versuche "new" komplett zu vermeiden. Daf├╝r kannst du in C++ Smartpointer verwenden, also z.B. std::unique_ptr. Dein Programm nutzt new und kein delete, es hat daher ein Speicherleck.

    2. Deine Basisklasse A hat schon die (privaten) Variablen my_i und my_s. Warum hast du in C und D gleichnamige weitere Variablen? Das erscheint nicht sinnvoll! Noch weniger sinnvoll ist dann auch, dass du get_my_i und get_my_s jeweils reimplementierst und darin eben die neuen, gleichnamigen, aber anderen Variablen nutzt.

    3. Verwende virtual in NUR der Basisklasse, wo du eine Funktion neu einf├╝hrst. Verwende in den abgeleiteten Klassen C und D stattdessen override, um sicherzustellen, dass du auch wirklich eine Funktion ├╝berschreibst.

    4. ├ťberlege, ob du den String in deinen Konstruktoren per const & ├╝bergeben willst (oder verwende std::move).

    Ansonsten sieht die Ausgabe doch so aus, wie man sie erwarten w├╝rde?

    Add: call A
    Add: call C
    Add: call D
    Add: call C
    do A:(1) call A
    do C:(2) call C
    do D (3) call D
    Add: C from inside_D
    Add: D from inside_D
    do C:(6) call C
    


  • Danke f├╝r die R├╝ckmeldung, werde ich gleich mal umsetzen.
    Nur war meine Urspr├╝ngliche ├ťberlegung, dass auch do_it aus der, von inside_D in die Queue eingef├╝gten Methode ausgef├╝hrt wird.
    Was habe ich hierbei ├╝bersehen?



  • @Uadan sagte in Problem mit Ableitung:

    Nur war meine Urspr├╝ngliche ├ťberlegung, dass auch do_it aus der, von inside_D in die Queue eingef├╝gten Methode ausgef├╝hrt wird.

    Du hast 2 Queues: eine in main, eine in D::do_it. Falls du das gemeint hast - bitte formuliere genauer, denn es ist nicht leicht zu erraten, was du wirklich gemeint hast. In dir Queue werden Objektinstanzen eingef├╝gt, aber keine Methoden. Das Komma in dem zitierten Satz verwirrt mich zus├Ątzlich. Bin mir also nicht sicher, was du wirklich erwartet hast.



  • @Uadan: Wolltest du in D::do_it (in Zeile 61/62) noch call_me.fetch(); aufrufen?

    Oder willst du der Queue der main-Funktion die Objekte hinzuf├╝gen? Dann ben├Âtigst du aber eine Referenz auf das B-Objekt (oder mittels einer Callback-Funktion o.├Ą.).


Log in to reply