Ausgabe Problem bei verschiedenen Objekten



  • Hallo zusammen. Ich habe verschiedene Objekte, die ich eingebe und dann ausgeben möchte(mit ein paar Berechnungen).
    Ich kann die Objekte richtig einlesen, nur bei der Ausgabe habe ich schwierigkeiten.
    Hier der Code:

    #include "GeomObjektHeader.h"
    #include "Kreis.h"
    #include "Rechteck.h"
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main(void)
    {
        int anzahl  = 0;
        int eingabe = 0;
        char auswahl;
        double x = 0;
        double y = 0;
        double a = 0;
        double b = 0;
        double d = 0;
        double U = 0;
        double A = 0;
    
        GeomObjekt objekt[3];
        GeomObjekt objektA;
        Rechteck   rechteck[1];
        Kreis      kreis[1];
    
    	 cout << "Anzahl der Objekte: ";
        cin  >> anzahl;   
        cout << endl;
    
        if(anzahl <= 0)
        {   
            cout << "Keine Objekte" << endl;
            exit(1);
        }
    
        objektA.zeigeObjekte();
    
        do
        {
            eingabe++;       
            cout << endl;
            cout << eingabe << ". Objekt ist ein: ";
            cin  >> auswahl;
    
            if(auswahl == 'p')
            {
                objekt[1].setName("Punkt");
                cout << "Punkt" <<endl;
                cout << "X = ";
                cin  >> x;       
                cout << "Y = ";
                cin  >> y;
                cout << endl;
                objekt[1].setXpos(x);
                objekt[1].setYpos(y);
                U = objekt[1].umfangBerechnung(0, 0, 0);
                objekt[1].setU(U);
                A = objekt[1].flaechenBerechnung(0, 0, 0);
                objekt[1].setAFlaeche(A);
            }       
            else if(auswahl == 'q')
            {
                objekt[2].setName("Quadrat");
                cout << "Quadrat" << endl;       
                cout << "X = ";
                cin  >> x;       
                cout << "Y = ";
                cin  >> y;
                cout << "a = ";
                cin  >> a;
                cout << endl;
    
                objekt[2].setXpos(x);
                objekt[2].setYpos(y);
                objekt[2].setA(a);
                U = objekt[2].umfangBerechnung(a, 0, 0);
                objekt[2].setU(U);
                A = objekt[2].flaechenBerechnung(a, 0, 0);
                objekt[2].setAFlaeche(A);
            }           
            else if(auswahl == 'r')
            {
                rechteck[1].setName("Rechteck");
                cout << "Rechteck" << endl;
                cout << "X = ";
                cin  >> x;
                cout << "Y = ";
                cin  >> y;
                cout << "a = ";
                cin  >> a;
                cout << "b = ";
                cin  >> b;
                cout << endl;
    
                rechteck[1].setXpos(x);           
                rechteck[1].setYpos(y);
                rechteck[1].setAR(a);
                rechteck[1].setBR(b);
                U = rechteck[1].umfangBerechnung(rechteck[1].getAR(), rechteck[1].getBR(), 0);
                rechteck[1].setU(U);
                A = rechteck[1].flaechenBerechnung(rechteck[1].getAR(), rechteck[1].getBR(), 0);
                rechteck[1].setAFlaeche(A);           
            }
            else if(auswahl == 'k')
            {
                kreis[1].setName("Kreis");
                cout << "Kreis" << endl;
                cout << "X = ";
                cin  >> x;
                cout << "Y = ";
                cin  >> y;
                cout << "d = ";
                cin  >> d;
                cout << endl;
    
                kreis[1].setXpos(x);           
                kreis[1].setYpos(y);
                kreis[1].setDK(d);
                U = kreis[1].umfangBerechnung(0 , 0, kreis[1].getDK());
                kreis[1].setU(U);
                A = kreis[1].flaechenBerechnung(0, 0, kreis[1].getDK());
                kreis[1].setAFlaeche(A);
            }           
        }
        while(eingabe < anzahl);       
    
    /*** Ausgabe der ganzen Objekte ***/
        eingabe = 0;
        cout << "Folgende Objekte wurden eingegeben:" << endl;   
        for(int i=1; i<=anzahl-1; i++)
        {
            eingabe++;
            if(objekt <= 0)
            {
                cout << "Keine Objekte eingegeben...";           
            }
            else
            {           
                cout << endl;
                cout << eingabe << ". Objekt ist ein ";
                cout << objekt[i].getName();
                cout << ":";
                cout << " P(";
                cout << objekt[i].getXpos();
                cout << ",";
                cout << objekt[i].getYpos();
                cout << ")" << endl;
                cout << "U = " << objekt[i].getU() << endl;
                cout << "A = " << objekt[i].getAFlaeche() << endl;
            }
    	 }
    
            if(rechteck <= 0)
            {
                cout << "Keine Objekte eingegeben...";       
            }
            else
            {           
                cout << endl;
                cout << eingabe << ". Objekt ist ein ";
                cout << rechteck[1].getName();
                cout << ":";
                cout << " P(";
                cout << rechteck[1].getXpos();
                cout << ",";
                cout << rechteck[1].getYpos();
                cout << ")" << endl;
                cout << "U = " << rechteck[1].getU() << endl;
                cout << "A = " << rechteck[1].getAFlaeche() << endl;
            }
    
            if(kreis <= 0)
            {
                cout << "Keine Objekte eingegeben...";            
            }
            else
            {           
                cout << endl;
                cout << eingabe << ". Objekt ist ein ";
                cout << kreis[1].getName();
                cout << ":";
                cout << " P(";
                cout << kreis[1].getXpos();
                cout << ",";
                cout << kreis[1].getYpos();
                cout << ")" << endl;
                cout << "U = " << kreis[1].getU() << endl;
                cout << "A = " << kreis[1].getAFlaeche() << endl;
            }    
    
        cout << "\n\n";
        return 0;
    }
    

    Wenn ich jetzt nur 1 Objekt eingebe dann gibt er mir 3 aus und mit irgendwelchen Zahlen. Ich hab leider keine idee, wie ich die for-schleife gestalten sollte. So dass er anhand der Abfrage(wieviele Objekte denn eingegeben werden sollen) auch das dann ausgibt.

    Auch wüsste ich z.b. nicht wie ich denn 2Punkt Objekte haben kann, ohne dass er das überschreiben würde?!?!
    Oder 2 Rechteck Objekte?!

    Ich hoffe einer von euch kann mir da weiter helfen. Die Berechnungen sollte soweit alle stimmen. Problem ist nur die Ausgabe.

    Danke im Vorraus!
    Gruß
    Manda



    1. Du legst dich ja auf 3 Objekte fest. Verwende statt dem Array "objekt[3]" doch eine std::list oder std::vector...
    2. Wenn du Recteck rechteck[1] schreibst ist nur ein Objekt möglich (eigentlich array überflüssig) aber der Aufruf "rechteck[1]" geht so was von in die Hose ^^.
    3. Die ganzen Abfragen "if(objekt <= 0)", was bezweckst du damit? Willst du die Größe des Arrays abfragen? dafür hast du doch anzahl... Oder bei Verwendung eines std::Kontainers die Methode "length()"
    4. Solltest du dir auch mal überlegen, ob du nicht mit Basisklassenzeigern arbeiten willst, damit du nicht GeomObject, Rechteck, Kreis, etc. Listen mitführen musst (die ja wahrscheinlich alle von GeomObject erben, oder?), dann kannst du mit dynamic_cast das Objekt casten oder arbeite mit einem type-enum, aus dem du gleich den Typen bekommst, damit du beim casten auch gleich sicher sein kannst.

    Außerdem wollte ich mal wissen, ob das die Forum-Software selber macht, diese Sternchen beim "voraus" oder "Standard", usw... Das seh ich hier andauernd und es nervt 😕 (Also bei meinem Post wirds angezeigt...)



  • Ohne mir das durchzulesen.Ein Tip für die Zukunft. Begrenze deinen Code-Teil auf die Stelle wo du eine Frage hast oder konkrete Probleme, und poste nicht alles, sonst liest sich das keiner durch und schließt den Thread wieder, weil er keinen bock hat. so wie ich 😃



  • @Firefighter - ich dachte es wäre besser alles zu posten, damit man weis was gemeint ist. Vielleicht habe ich ja oben was flasch gemacht und es dann nicht gepostet.
    Aber irgendwie hast du schon recht 🙂

    @tandem - ich versuch das mal mit Listen zu machen. Danke dir!
    EDIT: Bin gerade neu in C++ kenne daher das mit den Listen nicht. Kenne nur arrays aus C, darum habe ich versucht sowas in C++ zu machen.

    Gruß
    Manda


  • Administrator

    MandaJohn schrieb:

    @Firefighter - ich dachte es wäre besser alles zu posten, damit man weis was gemeint ist. Vielleicht habe ich ja oben was flasch gemacht und es dann nicht gepostet.
    Aber irgendwie hast du schon recht 🙂

    Wenn ich hier einfach mal weiterverweisen darf:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-200753.html

    Wenn ich dir zudem noch schnell ein zwei Tipps geben darf:
    - Verwende nicht die exit Funktion. Diese Funktion terminiert das Programm auf der Stelle und gibt keine Ressourcen mehr frei. Gerade in C++ mit dem RAII Konzept ist sowas äusserst ungünstig, da überhaupt gar keine Destruktoren mehr aufgerufen werden. Allerdings würde ich die Funktion auch nicht unbedingt in einem C Programm verwenden. Das ist wirklich die Vorschlaghammerlösung 😉
    - Eine ziemlich gute Referenz für die Standardbibliothek:
    http://www.cplusplus.com/reference/
    - Ich hoffe du hast dir ein gutes Buch gekauft, um C++ zu lernen? Wenn nicht, dann gebe ich mal einfach drei Empfehlungen:
    -> C++ Primer
    -> Thinking in C++ 1&2 (auch als gratis PDF erhältlich, nur Englisch)
    -> Die C++ Programmiersprache (vor allem zu empfehlen, wenn du bereits einiges an C Kenntnissen hast, sehr steile Lernkurve)

    Grüssli



  • Sorry Leute, aber ich stehe total auf dem Schlauch und komme bei meinem problem überhaupt nicht weiter (ich glaub ich werde noch Wahnsinning).

    Ich habe schon einiges rumprobiert, aber komme trotzdem nicht auf das was ich haben will. Ich kriege die Ausgabe nicht hin.

    Könnte mir einer von euch weiter helfen die Ausgabe hinzukriegen??

    Gruß
    Manda



  • MandaJohn schrieb:

    Könnte mir einer von euch weiter helfen die Ausgabe hinzukriegen??

    Nicht bei soviel Code oder wenn du weiterhin nicht auf die Antworten der Leute eingehst. Deine Fehlerbeschreibung ist ausserdem nicht gerade hilfreich.



  • Was wir sagen wollen, beschränke dein geposteten Code auf ein Minimapbeispiel, wo das Problem ist. Am besten du editierst deinen eingangspost.



  • Auf welche Antwort bin ich denn nicht eingegangen? Habe ich was überlesen?
    Also das Problem ist bei mir, dass ich nicht wirklich weis wie ich die verschiedenen Objekte ausgeben soll?

    Ich könnte zum Beispiel 2 Objekte vom Typ GeomObjekt haben. Das habe ich in der for-schleife um es auszugeben.
    Danach habe ich noch weitere Objekte (Rechteck und Kreis). Das gebe ich nach der for-schleife aus.

    Ich versuche es irgendwie hinzukriegen, dass ich alles in eine for-schleife tue und dann ausgebe.
    So kriege ich ein Objekt mehrmals und die Berechnungen stimmen nicht.
    Ich habe mich erstmal auf 2 GeomObjekte beschränkt, weil ich nicht wusste, wie ich mehrere Punkt-Objekte haben kann.
    Daraufhin hat mir "tandem" den tip gegeben, dass ich Kontainer benutzen könnte. Nur ich komme mit den Kontainern nicht so klar.

    Vielleicht kannst du mir sagen wie ich die Kontainer benutzen könnte? Ich hab mir auch den link angeguckt und die Bsp.
    Da kam ich nicht so gut klar und habs deshalb erstmal weggelassen.

    Oder bin ich auf noch etwas nicht eingegangen?



  • MandaJohn schrieb:

    Oder bin ich auf noch etwas nicht eingegangen?

    Meine punkte 2-4...
    2 führt zu undefiniertem Verhalten (wenn du Glück hast), lässt sich mit std::list vermeiden. (Wirft ne exception)
    3 ebenso. Insbesondere wohl zu den zusätzlichen Ausgaben (if rechteck <=0).



  • Einfach als Anhaltspunkt ein Beispiel auf die Schnelle:

    #include <iostream>
    #include <string>
    #include <list>
    
    class Base
    {
        public:
            virtual std::string message() =0;
    };
    
    class DerivedA : public Base
    {
        public:
            std::string message()
            {
                return "Hello from AAAA";
            }
    };
    
    class DerivedB : public Base
    {
        public:
            std::string message()
            {
                return "Hello from BBB";
            }
    };
    
    int main()
    {
        std::list<Base*> objects;
    
        objects.push_back( new DerivedA );
        objects.push_back( new DerivedB );
    
        std::list<Base*>::iterator it;
        for( it=objects.begin(); it != objects.end(); it++ )
            std::cout << (*it)->message() << std::endl;
    
        return 0;
    }
    

Anmelden zum Antworten