C++ Vektoren und Klassen



  • Hallo Zusammen,
    ich bin derzeit am C++ lernen. Ich habe zwei Headerdateien Bestellung und Artikel

    #include <iostream>
    #include <vector>
    #include "Artikel.h"
    #include <algorithm>
    
    using namespace std;
    
    
    class Bestellung
    {
    
    
    
    private:
        vector<Artikel> liste;
        double m_nettoBetrag;
        double m_porto;
        double m_portoGrenze;
        double m_mwstSatz;
    
    public:
        Bestellung(){};
         Bestellung(double nettoBetrag=0.00, double mwstSatz=19.00, double porto=4.90, double portoGrenze=80.00) : m_nettoBetrag(nettoBetrag), m_mwstSatz(mwstSatz), m_porto(porto), m_portoGrenze(portoGrenze)   {}
    
       
        bool entfernen(const string& Artikelbezeichnung){};
        double gesamNetto(){};
       
        void anzeige(){
        for( int i=0;i < liste.size(); i++){
    
                cout << liste.at(i) << endl;
    
        }
    
    
    
        }
    
        };
    
    
    #include <string>
    
    
    using namespace std;
    
    class Artikel{
    private:
        string m_bezeichnung;
        double m_preis;
        int m_anzahl;
    
    public:
        Artikel(){};
        Artikel (string bezeichnung, double preis, int anzahl) : m_bezeichnung(bezeichnung), m_preis(preis), m_anzahl(anzahl){}
    
        string getBezeichnung() const {return m_bezeichnung;}
        int getAnzahl() const {return m_anzahl;};
        double getPreis()  {return m_preis;}
        double gesamtPreis() const{ };
    
    
    
    
    };
    
    

    Leider kann ich mit der Funktion void anzeige() meinen Vektor nicht ausgeben lassen.
    Kann mir vielleicht jemand einen Tipp geben?



  • Damit man Objekte über std::cout und verwandte Kanäle ausgeben kann, muss für den jeweiligen Datentyp ein operator<< definiert sein. Für die Standard Typen ist das in der Standard Library der Fall. Du willst hier Objekte vom Typ Artikel ausgeben. Dazu muss folgende Funktion definiert werden, und daran denken, dass sie ggf. als friend von Artikel definiert sein muss.

    #include <iostream>
    
    std::ostream& operator<< (std::ostream& out, const Artikel& artikel) {
        /* Deine Ausgabebefehle */
    
        return out;
    }
    

    Edit: Fehlende Referenz ergänzt


  • Mod

    Wäre nett, wenn du auch sagen würdest, was "kann nicht" bedeutet. Ich rate mal, dass da ein Fehler kommt, dass man einen Artikel so nicht in einen ostream schmeißen könne (so etwas wie "no match for operator<< with operand types std::ostream and Artikel").

    Bei einem nutzerdefinierten Typ weiß ein ostream erst einmal nicht, was er damit machen soll, das muss dieser Typ selber definieren. Wenn ich dich fragen würde, was du als Ausgabe erwartet hättest, würdest du ja wahrscheinlich so etwas sagen wie

    Artikel(bezeichnung='abc', preis=1.48000000001, anzahl=3)
    Artikel(bezeichnung='xyz', preis=2.599999999998, anzahl=6)

    Das muss in deinem Programm irgendwo definiert werden, das kann sich der Compiler nicht einfach so ausdenken.

    Nun gäbe es prinzipiell die Möglichkeit, das so zu definieren, das out << liste.at(i) << endl; tatsächlich funktionieren würde. Siehe auch die Antwort von john0, der schneller geantwortet hat als ich. Ich nehme aber von deinem Stil her an, dass du da gerade nur Bahnhof verstehst. Für jemanden, der ganz am Anfang steht, wäre es vielleicht eher angebracht, wenn du auch eine Funktion anzeige für Artikel schreibst, und dann in der anzeige von Bestellung diese benutzt, also so etwas wie liste.at(i).anzeige().



  • Und schon mal als Warnung: Niemals using namespace std; (global) in Headerdateien (s.a. den Hinweis in Namespaces (C++): using-Direktiven)!


Anmelden zum Antworten