Ausgabe von Objekten mittels for-Schleife und Methoden



  • Hallo,

    ich bin C++ Anfänger und habe ein Problem bei einer Fragestellung.
    Es soll ein Vektor erstellt werden, in den 10 Objekte einer Klasse eingefügt werden, soweit so gut. Der Inhalt der Objekte soll nun mittels Methoden ausgegeben werden, womit ich nicht weiterkomme. Ich benutze zur Zeit keine Methode für die Ausgabe.. hat da vielleicht jemand einen Ansatz, wie ich die Ausgabe mittels Methode realisieren kann?

    lG

    class Zoo{
    public:	void setBesucher(int Besucher);
    	int getBesucher();
    private:
    	int Besucher;
    };
    void Zoo::setBesucher(int InfoBesucher)	{
    	Besucher = InfoBesucher;}
    
    int Zoo::getBesucher()	{
    	return Besucher;}
    
    int main()	{
    	Zoo Tag1, Tag2, Tag3, Tag4, Tag5, Tag6, Tag7, Tag8, Tag9, Tag10;
    	vector<int> Daten;
    	int i;
    
    	Tag1.setBesucher(1000); 
    	Tag2.setBesucher(2000);
    	Tag3.setBesucher(1500); 
    	Tag4.setBesucher(4000);
    	Tag5.setBesucher(3500);
    	Tag6.setBesucher(1000); 
    	Tag7.setBesucher(0);
    	Tag8.setBesucher(1100); 
    	Tag9.setBesucher(1900);
    	Tag10.setBesucher(1600); 
    
    	Daten.push_back(Tag1.getBesucher());
    	Daten.push_back(Tag2.getBesucher());
    	Daten.push_back(Tag3.getBesucher());
    	Daten.push_back(Tag4.getBesucher());
    	Daten.push_back(Tag5.getBesucher());
    	Daten.push_back(Tag6.getBesucher());
    	Daten.push_back(Tag7.getBesucher());
    	Daten.push_back(Tag8.getBesucher());
    	Daten.push_back(Tag9.getBesucher());
    	Daten.push_back(Tag10.getBesucher());
    
    	for(i=0; i<10; i++)	{
    
    	cout << "Besucher: " << Daten[i] << endl;				
    	}
    


  • In C++ lässt sich der operator<< für beliebige Benutzer definierte Typen überladen (dies gilt übrigens auch für den operator>> und sehr viele andere Operatoren). Das macht man so:

    std::ostream& operator<<(std::ostream& os, const Zoo& zoo)
    {
        // hier kannst du ausgeben wie du möchtest, z.B.
        return os << "Besucher: " << zoo.getBesucher();
    }
    

    Das sieht erstmal vielleicht etwas kompliziert aus, ist aber ganz einfach: Die Funktion wird beim << Operator aufgerufen. Wenn du schreibst

    std::cout << meinZoo << '\n';
    

    Dann erkennt der Compiler, dass du ein Zoo Objekt ausgeben möchtest, und sucht den passenden operator<<. Wenn du diesen definierst, findet er ihn auch und ruft ihn mit dem ostream (hier std::cout) und deiner Instanz vom Objekt Zoo auf. Der ostream wird zurückgegeben, damit wir beliebig << Operatoren aneinanderhängen können:

    std::cout << meinZoo << '\n' << meinAndererZoo << '\n';
    

    Ich habe versucht das richtig auszudrücken und hoffe es war verständlich.

    Anmerkungen: Der operator<< ist zwar keine *Methode* der Klasse Zoo, sollte aber einem Unsinn wie

    std::cout << meinZoo.toString() << '\n';
    

    definitiv vorgezogen werden. Außerdem speicherst du momentan ints in deinen Vektor und nicht Objekte vom Typ Zoo.

    Methoden, welche die Klasse nicht verändern (z.B. getBesucher()) werden meistens const gemacht.

    int getBesucher() const;
    // ....
    int Zoo::getBesucher() const
    {
        // ...
    }
    

    Du könntest für die Klasse Zoo auch einen Konstruktor definieren. Dieser wird aufgerufen sobald du eine Instanz vom Typ Zoo erstellst, und sollte dazu dienen, deine Zoo Objekte in einen gültigen Zustand zu versetzen (d.h. nach dem Konstruktor aufruf kannst du verschiedene Methoden/Operationen ausführen und diese sollten dann auch Funktionieren). Ein Beispiel:

    class Zoo {
    public:
        explicit Zoo(int besucher);
    // ...
    Zoo::Zoo(int b):
        :Besucher{b}  // alternativ () statt {};  Besucher wird hier mit dem Wert von b initialisiert.
    {
    }
    

    Das explicit bringt im Klartext, dass du keine ints verwenden kannst, wo eigentlich Zoos erwartet werden, ohne dass zu explizit sagst es soll ein Zoo sein. Es ist empfehlenswert Konstruktoren mit genau einem Parameter generell als explicit zu deklarieren. Dies ist damit begründet, dass bei Konstruktoren mit einem Parameter von Haus aus eine implizite Umwandlung from Typ des Parameters in den Klassen-Typ ermöglicht wird. Sowas kann unerwartete/unerwünschte Nebeneffekte haben.

    Man darf auch die C++ Code-Tags verwenden. *wink wink*

    LG



  • Es wird wohl kein vector<int> gemeint sein.



  • Habe es mitlerweile hinbekommen, aber danke. Der Hinweis, dass es sich nicht um Obejkte sondern um ints handelt war hilfreich.


Anmelden zum Antworten