vector mit Zeigern auf Klasse



  • Hi,
    ich habe ein recht großes Programm, weshalb ich hier auch nicht alles Posten kann. Es besteht aus einigen Klassen und ich habe 2 Probleme damit.
    1. In einer dieser Klassen (B) gibt es einen vector der mit Zeigern gefüllt wird. Diese Zeiger sollen auf Objekte zeigen die aus den beiden Kindklassen von A entstanden sind. Ist es richtig hier vector <A*> zu benutzen?
    2. Die Methode drucken() soll mir sämtliche Eigenschaften des jeweiligen Objekts ausgeben. Da ich aber nur Zeiger innerhalb eines Vectors besitze kann ich nicht einfach die Methode ausführen indem ich *obj_a1.drucken() sage.
    Wie gehe ich hier vor?

    class A{
    private:
      ...
    public:
      virtual void drucken(){
        std::cout<<"Irgendwas"<<endl;
      }
    }
    
    class A_1 :public A{
    private:
      ...
    public:
      void drucken(){
        A:drucken();
        std::cout<<"Irgendwas neues"<<endl;
      }
    }
    
    class A_2 :public A{
    private:
      ...
    public:
      void drucken(){
        A:drucken();
        std::cout<<"Irgendwas anderes"<<endl;
      }
    }
    
    class B{
    private:
      vector<A*>liste;
      ...
    public:
      ...
    }
    

  • Mod

    Ist es richtig hier vector <A*> zu benutzen?

    Hätten wir für so einen Quatsch bloß 'nen Artikel...



  • 1.: Nein - mit rohen Zeigern sollte man nicht arbeiten
    2.: Warum solltest Du das nicht können? Die Methode drucken ist doch virtuell.



  • tntnet schrieb:

    1.: Nein - mit rohen Zeigern sollte man nicht arbeiten

    Wie mach ich das denn besser?

    tntnet schrieb:

    2.: Warum solltest Du das nicht können? Die Methode drucken ist doch virtuell.

    Ich habe jetzt z.b. eine Listenausgabe gemacht:

    for (int i = 0; i < liste.size(); i++){
    	*liste.at(i).drucken();
    }
    

    Da sagt er mir: Der Ausdruck muss einen Klassentyp aufweisen!
    Was mache ich falsch?



  • Neuer001 schrieb:

    tntnet schrieb:

    1.: Nein - mit rohen Zeigern sollte man nicht arbeiten

    Wie mach ich das denn besser?

    Mit Smart Pointern. Hier ist unique_ptr sinnvoll:

    vector<unique_ptr<A>>liste;
    liste.push_back(make_unique<A_1>());
    liste.push_back(make_unique<A_2>());
    

    Der Vorteil ist, dass man nicht von Hand delete aufrufen muss und es daher auch nicht vergessen kann oder sonst irgendeinen blöden Fehler den man gerne mit selbst reserviertem Speicher macht.

    Neuer001 schrieb:

    Ich habe jetzt z.b. eine Listenausgabe gemacht:

    for (int i = 0; i < liste.size(); i++){
    	*liste.at(i).drucken();
    }
    

    Da sagt er mir: Der Ausdruck muss einen Klassentyp aufweisen!
    Was mache ich falsch?

    Das Dereferenzieren hat niedrigere Priorität als Memberfunktion aufrufen. Du müsstest also Klammern setzen:

    for (int i = 0; i < liste.size(); i++) {
      (*liste.at(i)).drucken();
    }
    

    Oder kürzer: Den operator-> nutzen:

    for (int i = 0; i < liste.size(); i++) {
      liste.at(i)->drucken();
    }
    

Anmelden zum Antworten