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.ä.).


Anmelden zum Antworten