Neu in C++ (Getter/Setter) Methoden



  • Hallo blub²,

    wie könnte ich denn sagen, wenn ich z.b 3 Objekte eingeben möchte, dass er auch 3 Objekte dann erstellt?
    Also so etwa:
    Anzahl der Objekte: 3

    Ich erstelle ja ein Objekt, wie du gesagt hast:
    GeomObjekt objekt;

    Wie könnte ich denn anhand der abfrage die Objekte erstellen? Würde er nicht immer nur eins erstellen?
    Oder gibt es eine Möglichkeit objekt1, objekt2 usw. zu erstellen?



  • Entweder du legst dir ein Array auf Vorrat an:
    GeomObjekt objekte[1000];
    was ich aber für nicht so sinnvoll halte.

    Besser wäre der bereits gepostete std::vector. Damit könntest du einfach sowas machen:

    std::vector<GeomObjekt> objekte;
    
    cin >> anzahl;
    
    objekte.resize(anzahl);
    

    Kuck dir doch mal den geposteten Link an.



  • Den Link habe ich mir angeguckt. Aber irgendwie gibt er mir jetzt Fehler aus.

    cout << "Anzahl der Objekte: ";
    
    	std::vector<GeomObjekt> objekt;
    	cin  >> anzahl;	
    	objekt.resize(anzahl); 	
    
    	objekt.zeigeObjekte();//Fehler: zeigeObjekte() ist kein Element von Vector
    

    Was ich nicht ganz verstanden habe: Hätte ich jetzt mehrere Objekte zur Verfügung um auf die anderen Methoden zuzugreifen?
    Also sowas bsp.: objekt1.setName("Punkt") oder wäre es immer das selbe Objekt das auf die Methoden zugreift?
    Irgendwie fehlt mir da der durchblick.

    Wäre es nicht einfach sowas zu versuchen (dann verstehe ich das vielleicht etwas besser 😉 )

    cout << "Anzahl der Objekte: ";
    	cin  >> anzahl;	
    	cout << endl;
    
    	for(int i=0; i<=anzahl; i++)
    	{
                    //Könnte ich hiermit auch mehrere Objekte erstellen?
    		GeomObjekt objekt[i];
    	}
    


  • MandaJohn schrieb:

    Wäre es nicht einfach sowas zu versuchen (dann verstehe ich das vielleicht etwas besser 😉 )

    cout << "Anzahl der Objekte: ";
    	cin  >> anzahl;	
    	cout << endl;
    	
    	for(int i=0; i<=anzahl; i++)
    	{
                    //Könnte ich hiermit auch mehrere Objekte erstellen?
    		GeomObjekt objekt[i];
    	}
    

    Uargh. Stichwort Scopes, das geht völlig schief noch dazu kannst du Arrays nur mit statischen "Anzahlen" anlegen. Tipp: kuck dir erstmal Arrays richtig an.



  • So, habe es mir einfacher gemacht. Ich nehme einfach maximal 5 Objekte (für den Anfang). Bis es läuft, dann kann man es ja noch ändern.

    GeomObjekt objekt[5];
    cout << "Anzahl der Objekte: ";
    cin  >> anzahl;	
    cout << endl;
    
    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);
    		}
    		else if(auswahl == 'q')
    		{
    			objekt[2].setName("Quadrat");
    			cout << "Quadrat" << endl;		
    			cout << "X = ";
    			cin  >> x;		
    			cout << "Y = ";
    			cin  >> y; 
    			cout << "a = ";
    			cin  >> a;
    			cout << "b = ";
    			cin  >> b; //Wieso komme ich hier nicht hin? Kann nichts für b eingeben.
    			cout << endl;
    
    			objekt[2].setXpos(x);
    			objekt[2].setYpos(y);
    			objekt[2].setA(a);
    			objekt[2].setB(b);
    		}
    
    		else if(auswahl == 'r')
    			objekt[3].setName("Rechteck");
    		else if(auswahl == 'k')
    			objekt[4].setName("Kreis");		
    	}
    	while(eingabe < anzahl);
    

    Habe erstmal für p und q die Werte gesetzt. Das scheint auch zu klappen. Nur habe ich gerade Probleme bei der Ausgabe. Die sieht etwa so aus:

    for(int i=0; i<5; i++)
    		{
    			eingabe++;
    			cout << endl;
    			cout << eingabe << ". Objekt ist ein ";
    			cout << objekt[i].getName();
    			cout << ":";
    			cout << "P("; 
    			cout << objekt[i].getXpos(); 
    			cout << ","; 
    			cout << objekt[i].getYpos(); 
    			cout << ")";
    		}
    

    Erstmal will ich nur die Punkte ausgeben. Stimmt etwas mit der for-schleife nicht? Irgendwie gibt er nicht das aus was ich eingegeben habe 😕



  • Könnte mir jemand bei der Ausgabe helfen?

    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);
    			objekt[1].setU(U);
    			A = objekt[1].flaechenBerechnung(a, b);
    			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 << "b = ";
    			cin  >> b;
    			cout << endl;
    
    			objekt[2].setXpos(x);
    			objekt[2].setYpos(y);
    			objekt[2].setA(a);
    			objekt[2].setB(b);
    			U = objekt[2].umfangBerechnung(a);
    			objekt[2].setU(U);
    			A = objekt[2].flaechenBerechnung(a, b);
    			objekt[2].setAFlaeche(A);
    		}
    

    Ich kriege die Ausgabe nicht hin. Er gibt die x,y Koordinaten richtig aus. Der Name ist was völlig anderes. Der Umfang und die Fläche ist auch korrekt.
    (Außer erstmal für Kreis und Rechteck, aber das kommt später)

    Im Header sieht das für Namen so aus:

    private:
    	double xpos;
    	double ypos;
    	char name[10]; 
    	char color[10];
    

    Der Getter/Setter dafür:

    char GeomObjekt::getName()
    {
    	return (char)name; //Ist das casten hier ok??
    }
    
    void GeomObjekt::setName(char Name[10])
    {
    	strcpy(name, Name);
    }
    

    Das ist die Ausgabe:

    for(int i=1; i<5; i++)
    		{
    			eingabe++;
    			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;
    
    		}
    

    Folgende Objekte wurden eingegeben:
    1. Objekt ist ein 4:P(1,3) //Hier fehlen überall die Namen?!?!
    U = 0
    A = 0

    2. Objekt ist ein |:P(3,4)
    U = 8
    A = 6

    3. Objekt ist ein ─:P(0,0)
    U = -9.25596e+061
    A = -9.25596e+061

    4. Objekt ist ein ♀:P(0,0)
    U = -9.25596e+061
    A = -9.25596e+061

    Habt ihr Tips für mich??
    Danke schonmal!
    Gruß

    Manda



  • char GeomObjekt::getName()
    {
        return (char)name; //Ist das casten hier ok??
    }
    

    Nein, ist nicht OK. Du castest da einen Zeiger auf ein Array von char zu einem char. Benutz am besten ein std::string für namen und co.
    Oder zumindest für die Rückgabe.

    std::string GeomObjekt::getName()
    {
        return std::string ( name );
    


  • Danke für die Antwort. Ich bekomme allerdings einen Fehler, muss ich dafür eine Bibliothek einbinden?

    Müsste ich auch meine Variable: char name[10] umändern? in ein string?



  • MandaJohn schrieb:

    Danke für die Antwort. Ich bekomme allerdings einen Fehler, muss ich dafür eine Bibliothek einbinden?

    Du musst:

    #include <string>
    

    noch anfügen.

    Müsste ich auch meine Variable: char name[10] umändern? in ein string?

    Ja, am besten wäre es.



  • Ah Super Danke, jetzt läufts auch. Hat eine Ketten reaktion ausgelöst, weil ich überall char name[10] hatte.

    Gruß
    Manda


Anmelden zum Antworten