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 einoperator<<
definiert sein. Für die Standard Typen ist das in der Standard Library der Fall. Du willst hier Objekte vom TypArtikel
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
-
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 einenostream
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 Funktionanzeige
fürArtikel
schreibst, und dann in deranzeige
vonBestellung
diese benutzt, also so etwas wieliste.at(i).anzeige()
.
-
Und schon mal als Warnung: Niemals
using namespace std;
(global) in Headerdateien (s.a. den Hinweis in Namespaces (C++): using-Direktiven)!