Array an Klassenfunktion übergeben



  • Hallo,
    ich versuche in diesem Programm ein Array mit 3 Instanzen einer Klasse an eine Methode einer anderen Klasse zu übergeben.
    In der Klasse Methode "getraenkeanzeigen" kommt der Fehler:
    "error: base operand of '->' has non-pointer type 'mygetraenk'|"

    Irgendwie bekomme ich es nicht raus, was ich falsch mache.
    Vielleicht hat ja jemand einen Tipp für mich.
    Vielen Dank im Voraus!

    #include <iostream>
    
    using namespace std;
    
    class mygetraenk
    {
        //die Attribute
        string flaschenname;
        int flaschenpreis;
        int flaschenlagerbestand;
    
        //die Methoden
        public:
        //der Konstruktor
        mygetraenk(string getraenkname, int getraenkpreis, int getraenkbestand);
        //der Destruktor
        ~mygetraenk();
    
        //zum Abfragen des Namems
        string getName();
        //zum Abfragen des Preises
        int getPreis();
        //zum Abfragen des Lagerbestands
        int getLagerbestand();
    
        //zum Setzen des Lagerbestands
        void setLagerbestand(int anzahl);
    };
    
    mygetraenk::mygetraenk(string getraenkname, int getraenkpreis, int getraenkbestand) {
        flaschenname = getraenkname;
        flaschenpreis = getraenkpreis;
        flaschenlagerbestand = getraenkbestand;
    }
    
    mygetraenk::~mygetraenk(){
        cout << "Eine Getraenkeinstanz wurde geloescht." << endl;
    }
    
    string mygetraenk::getName() {
        return flaschenname;
    }
    
    int mygetraenk::getPreis() {
        return flaschenpreis;
    }
    
    int mygetraenk::getLagerbestand() {
        return flaschenlagerbestand;
    }
    
    void mygetraenk::setLagerbestand(int anzahl) {
        flaschenlagerbestand = anzahl;
    }
    
    class flaschenautomat
    {
       //die Attribute
        flaschenautomat* getraenkeliste[3];
    
        //die Methoden
        public:
        //der Konstruktor
        flaschenautomat();
        //der Destruktor
        ~flaschenautomat();
    
        //zum Anzeigen eines Getraenks
        void getraenkanzeigen(int getraenkeIndex,mygetraenk getraenkeliste[3]);
    
    };
    
    flaschenautomat::flaschenautomat()
    {
    }
    
    flaschenautomat::~flaschenautomat()
    {
        cout << "Der Automat wurde geloescht." << endl;
    }
    
     void flaschenautomat::getraenkanzeigen (int getraenkeIndex,mygetraenk getraenkeliste[3])
     {
        cout << "Das gewaehlte Getraenk: " << getraenkeliste[getraenkeIndex-1]->getName();
     }
    
    int main()
    {
        string tempgetraenkname;
        int tempgetraenkpreis;
        int tempgetraenkbestand;
    
        int getraenkkenummer;
    
        mygetraenk *getraenkeliste[3];
    
        flaschenautomat *automat1 = new flaschenautomat();
    
        cout << "Bitte geben Sie die Getraenke ein: " << endl;
        for (int index = 0; index < 3; index++) {
            cout << "Getraenkename: ";
            cin >> tempgetraenkname;
            cout << "Getraenkepreis: ";
            cin >> tempgetraenkpreis;
            cout << "Getraenkeanzahl: ";
            cin >> tempgetraenkbestand;
            getraenkeliste[index] = new mygetraenk(tempgetraenkname,tempgetraenkpreis,tempgetraenkbestand);
        }
    
         cout << "Bitte Getraenkenummer eingeben: ";
         cin >> getraenkkenummer;
    
        automat1->getraenkanzeigen(getraenkkenummer,getraenkeliste[3]);
    
        return 0;
    }
    


  • Ersetze "->" durch ".".



  • Aha! Das kannte ich noch nicht.
    Jetzt compiliert alles ohne Fehler, das Programm startet und ich kann die drei Getränke pflegen und auch die Zahl von dem Getränk eingeben, welches ich ausgeben möchte.
    Dann stürzt das Programm aber einfach ab 😞



  • Ich habe mir jetzt deinen Code erst angesehen.
    Wo lernst du C++? Tutorial? Buch? Uni?
    Wenn Buch oder Tutorial bitte sagen und ggf. ein vernünftiges Buch kaufen.
    Wenn du an der Uni lernst, hast du Pech gehabt. Dein Professor/Dozent ist offenbar in Java beheimatet - alle Klassenobjekte werden mit new erzeugt. Zum einen ist das Speicherleck anfällig, zum anderen vollkommen überflüssig.
    Das du den '.' Operator offenbar nicht kennst, ist ein Beispiel dafür.
    Der Grund, warum das Programm abstürtzt ist, dass du ein Array von Pointern verwendest, es aber nicht initialisierst. Deine Pointer zeigen somit auf irgendeinen Speicherbereich und wenn du versuchst den zu ändern bekommst du eine Zugriffsverletzung und das Program stürzt ab.
    Du musst die Objekte des Arrays mit new erzeugen oder - besser - einfach ein Array von Objekten verwenden. Schreibe den Code am besten so um, dass sich alle Objekte auf dem Stack befinden.
    Also:

    Klasse *objekt = new Klasse;
    ...
    delete objekt;
    

    wird zu

    Klasse objekt;
    

    Zugriff auf Member dann mit "." anstatt "->".



  • Nathan schrieb:

    Der Grund, warum das Programm abstürtzt ist, dass du ein Array von Pointern verwendest, es aber nicht initialisierst. Deine Pointer zeigen somit auf irgendeinen Speicherbereich und wenn du versuchst den zu ändern bekommst du eine Zugriffsverletzung und das Program stürzt ab.

    Das Problem ist wohl eher, dass nicht richtig klar ist, was an flaschenautomat::getraenkanzeigen() übergeben werden soll und was übergeben wird - und zusätzlich noch ein Zugriffsfehler im Array getraenkeliste .

    Sollte wohl so aussehen:

    class flaschenautomat
    {
      // [...]
      void getraenkanzeigen(int getraenkeIndex,mygetraenk * getraenkeliste[3]);
    };
    
    int main(){
      // [...]
      automat1->getraenkanzeigen(getraenkkenummer,getraenkeliste);
    }
    

    Der Quelltext hat ein paar Macken, aber das wird schon 😉



  • Furble Wurble schrieb:

    Nathan schrieb:

    Der Grund, warum das Programm abstürtzt ist, dass du ein Array von Pointern verwendest, es aber nicht initialisierst. Deine Pointer zeigen somit auf irgendeinen Speicherbereich und wenn du versuchst den zu ändern bekommst du eine Zugriffsverletzung und das Program stürzt ab.

    Das Problem ist wohl eher, dass nicht richtig klar ist, was an flaschenautomat::getraenkanzeigen() übergeben werden soll und was übergeben wird - und zusätzlich noch ein Zugriffsfehler im Array getraenkeliste .

    Oh stimmt ja, der Speicher wird angefordert.
    Habe ich übersehen.



  • Also, ich lerne C++ im Rahmen einer Medieninformatik Studiums per Fernhochschule.
    Das Thema Klassen/Funktionen und Zeiger wurde bisher nur in einem Studienheft behandelt.
    Aber Sekundärliteratur wollte ich mir auch besorgen.
    Habt ihr einen Tipp für ein gutes C++ Buch, das auch für Anfänger geeignet ist, wenn möglich mit vielen Übungen?

    Mit euren Tipps oben hab ich es leider auch nicht hinbekommen, stehe auf dem Schlauch.
    Ich denke ich werde erstmal Bücher wälzen 🙂



  • StingerMKO schrieb:

    Also, ich lerne C++ im Rahmen einer Medieninformatik Studiums per Fernhochschule.

    Okay.
    Das wichtigste ist meines Erachtens, dass Du Dir klar bist über jeden einzelnen Buchstaben in Deinem Code.
    Der Code und der Fehler sehen mir so aus, als ob Du ein wenig den Überblick verloren hast.

    Was willst Du machen? Wie ist die Aufgabe?

    Ein Getränkeautomat, der Getränke enthält - so viel ist klar.
    Was sind die Eigenschaften eines Getränks? Lagerbestand? Sicher nicht. Überleg nochmal.
    Ebenso: was sind die Eigenschaften eines Flaschenautomats?
    Vielleicht - unter anderem - Slots? Im Sinne von

    class slot{
      public:
         mygetraenk g;
         int anz; 
    };
    

    Du brauchst in der ganzen Aufgabe keine Zeiger, kein new und kein delete soviel ist sicher.

    Das mit dem Array treiben wir Dir auch noch aus! 🙂

    Also: mein Vorschlag: nimm eine einfache Version von getraenk, damit Du den Überblick behältst:

    class getraenk{
    public:
      getraenk(std::string n) { name=n; }
      std::string get_name(){ return name; }
    private:
      std::string name;
    };
    

    Jetzt bau eine Klasse Flaschenautomat, die "irgendwie" Instanzen von getraenk bevoratet - siehe meinen Vorschlag slot oben.
    Sobald Du das Gefühl hast Zeiger benutzen zu muessen (->, 😉 bist Du auf dem falschen Dampfer.

    Happy hacking!



  • Ok, leider ist die Aufgabenstellung ein wenig komplexer und diesen Teil habe ich mal in Kurzform aus dem Gesamtprogramm rausgezogen, damit ich das Forum nicht überlaste mit zu vielen Codezeilen.

    In der Tat sind in dieser Lektion gerade Zeiger dran, die wir auch benutzen sollen und ja, das Getränk hat genau diese drei Attribute.

    Der Getränkeautomt lief schon wunderbar, nur dass ich jetzt halt das Array mit Zeigern auf die Instanzen benutzen soll.

    Naja, mal schauen, wie es weitergeht damit 🙂



  • StingerMKO schrieb:

    In der Tat sind in dieser Lektion gerade Zeiger dran, die wir auch benutzen sollen und ja, das Getränk hat genau diese drei Attribute.

    Der Getränkeautomt lief schon wunderbar, nur dass ich jetzt halt das Array mit Zeigern auf die Instanzen benutzen soll.

    Hmmm...tja... 😞

    Na dann! 🙂

    Ich schätze der Automat soll eigentlich die Getränkeliste beinhalten, oder?
    Du hast da schon das etwas widersprüchliche Konstrukt

    class flaschenautomat
    {
       //die Attribute
        flaschenautomat* getraenkeliste[3];
       // [...] 
    };
    

    Also ein Array von 3 Zeigern auf flaschenautomat - das soll sicher nicht so sein.

    Wahrscheinlich willst Du auch bei getraenkeanzeigen() die Getränke in dem Automaten anzeigen, nicht die in der Liste, die Du mitgibst.
    Richtig? Da musst Du nochmal ran.

    Viel Erfolg!


Anmelden zum Antworten