abstrakte Klasse



  • hallo,
    ich habe eine abstrakte Klasse Atrikel. Und Eine Klasse Bucher die die Attribute von Artikel haben soll.
    Das ganze sieht bis jetzt so aus :

    Klasse Artikel:

    class Artikel
    {
      public:
        //##ModelId=437DBE420148
        virtual void print() = 0;
    
      private:
        //##ModelId=437DBDBB035B
        int ArtikelNr;
    
        //##ModelId=437DBDDE0138
        double Preis;
    
        //##ModelId=437DBEBB0280
        string Titel;
    
    };
    

    Klasse Buecher:

    class Buecher : public Artikel
    {
      public:
        //##ModelId=437DC823007D
        bool suche();
    
        void print();
    
        //void ausgabe();
    
        //##ModelId=438313E0009C
        Buecher();
    
        //##ModelId=438313ED030D
        ~Buecher();
    
      private:
        //##ModelId=437DBE9000EA
        string Autor;
    
    };
    

    Jetzt möchte ich eine Instanz der Klasse Buecher anlegen und den Inhalt( ArtikelNur, Preis,Titel,Autor) mit der Methode print ausgeben.

    Ausschnitt aus dem Hauptprogramm:

    Artikel *Buch;
    Buch = new Buecher();
    Buch.print();
    

    Funktion Print()

    void Buecher::print()
    {
      cout << " ArtikelNr " << ArtikelNr;
      //cout << " Preis " << Preis;
      //cout << " Titel " << Titel;
      cout << " Autor " << Autor;
      return ;
    }
    

    Das Problem bei cout << " ArtikelNr " << ArtikelNr;
    kommt [C++ Fehler] Bücher.cpp(41): E2247 Zugriff auf 'Artikel::ArtikelNr' nicht möglich...
    weis eine Rat ?? wäre Toll ...Danke
    chris



  • Du hast ArtikelNr private gemacht. dann kann auch nur Artikel drauf zugreifen.
    Machs protected.
    BTW das ist falsch

    Artikel *Buch;
    Buch = new Buecher();
    //Buch.print();
    Buch->print();
    


  • hallo,
    Danke für diese schnelle Antwort.
    Funktioniert.
    Chris



  • btw, Singular von "Buecher" ist "Buch" 😉



  • Nein, protected ist nicht gut. Variablen sollten immer private sein. Du könntest natürlich Getter Methoden implementieren, aber am einfachsten machst du folgendes:

    #include <iostream>
    
    class Artikel {
    public:
      Artikel() : ArtikelNr(100) { }
      virtual void print() const =0;
    
    private:
      int ArtikelNr;
      // ...
    };
    
    // Die Artikel Klasse hat ein print, was die Artikel Informationen ausgibt
    void Artikel::print() const {
      std::cout << "Artikel Nummer: " << ArtikelNr << '\n';
    }
    
    class Buch : public Artikel {
    public:
      void print() const;
    };
    
    void Buch::print() const {
      Artikel::print(); //Das wird einfach von abgeleiteten Klassen aufgerufen
      std::cout << "Buch\n";
    }
    
    int main() {
      Buch b;
      b.print();
    }
    

Anmelden zum Antworten