C++ Getter/Setter Problem mit char Variable

@Reitinger: Die getter/setter sehen so aus:
C++:
std::string GeomObjekt::getName()
{
	return std::string(name);
}

void GeomObjekt::setName(std::string Name)
{
	name = Name;
}
Das ist das was Matthias angesprochen hatte.
C++:
std::string GeomObjekt::getName() const { ... }

void GeomObjekt::setName(const std::string& name) { ... }
Ich weis auch nicht, wie ich das mit Rechteck/Kreis ausgeben könnte. Da sie ja nicht vom Typ GeomObjekt sind.
Doch, Rechteck und Kreis sind vom Typ GeomObjekt.

Den Rest des Codes muss ich erstmal wirken lassen. Aber im Grunde mußt du einen Container (Array, Liste, Vektor etc.) von Zeigern auf GeomObjekt verwenden:
C++:
vector<GeomObjekt*> objekte;

objekte.push_back(new Rechteck());
objekte.push_back(new Kreis());
Ich kenne allerdings die Aufgabe auch nicht...

Gruß
 
@deepthroat - Soll ich sonst mal den ganzen code posten? Vielleicht hilft das mehr.
Ich dachte das kreis und rechteck vom Typ derer Klassen sind und nicht vom Typ GeomObjekt.
Aber ich denke du meinst, da es ja geerbet wird, sind sie auch vom Typ GeomObjekt, oder?

Gruß
Manda
 
@deepthroat - Soll ich sonst mal den ganzen code posten? Vielleicht hilft das mehr.
Ich dachte das kreis und rechteck vom Typ derer Klassen sind und nicht vom Typ GeomObjekt.
Aber ich denke du meinst, da es ja geerbet wird, sind sie auch vom Typ GeomObjekt, oder?
Ja, Vererbung stellt eine is-a Beziehung zwischen Klassen her.

Also zumindest die Klassendefinitionen wären hilfreich. Und evlt. die eigentliche Aufgabe.

Gruß
 
Zuletzt bearbeitet:
Also hier der Code: (den ich bisher habe)
C++:
#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];

	 //Hier abfragen wieviele Objekte es sein sollen
	 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());
            rechteck[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; i++)
    {
        eingabe++;
        if(objekt <= 0)
        {
            cout << "Keine Objekte eingegeben...";
            exit(1);
        }
        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;
        }
	 }
		//SEHR UNSICHER WIE ICH RECHTECK/KREIS ausgeben soll	
        if(rechteck <= 0)
        {
            cout << "Keine Objekte eingegeben...";
            exit(1);
        }
        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...";
            exit(1);
        }
        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;
}

Aufgabe:
Einfach nur für verschiedene Objekte (Punkt, Quadrat, Recht, Kreis) Umfang und Flächen berechnen. Außer bei Punkt, hat ja keine Fläche/Umfang.
Werte über Tastatur einlesen, anschließend berechnen und dann ausgeben.

Ich denke, dass ich das mit der Eingabe richtig mache. Außer das ich feste Objekte habe, nicht mehrere Punkte oder Quadrate.
Nur die Ausgabe bereitet mir Kopfschmerzen. Ich weis nicht wie ich alle ausgeben könnte :confused:

Ich hoffe es halt geholfen.
Gruß
 
Also hier der Code: (den ich bisher habe)
Es fehlen die Klassendefinitionen.
Aufgabe:
Einfach nur für verschiedene Objekte (Punkt, Quadrat, Recht, Kreis) Umfang und Flächen berechnen. Außer bei Punkt, hat ja keine Fläche/Umfang.
Werte über Tastatur einlesen, anschließend berechnen und dann ausgeben.
Die Aufgabenbeschreibung ist äußerst vage. Ist irgendwas vorgegeben?

Und wieso willst du dann eine Menge von diesen Objekten verwalten wenn die Aufgabe nur einlesen und berechnen vorsieht?

Hast du denn schonmal was von Funktionen gehört? Haben denn die Klassen keinen Konstruktor?

Gruß
 
Es kann ja sein, dass man jetzt mehrere Quadrate eingeben will. Deswegen dachte ich, dass ich mehrere davon brauche.
Ich hoffe, ich schicke jetzt das richtige:
Klasse: GeomObjekt.cpp
C++:
#include "GeomObjektHeader.h"
#include <iostream>
#include <string>

using namespace std;

GeomObjekt::GeomObjekt()
{
	xpos = 0;
	ypos = 0;
}

void GeomObjekt::zeigeObjekte()
{
	cout << "Eingabe der Objekte" << endl;
	cout << "  p - Punkt"				<< endl;
	cout << "  q - Quadrat"		   	<< endl;
	cout << "  r - Rechteck"			<< endl;
	cout << "  k - Kreis"				<< endl;
}

void GeomObjekt::setzeWerte(int Xpos, int Ypos, std::string Name, std::string Color)
{
	xpos = Xpos;
	ypos = Ypos;
	name = Name;
	color= Color;
}

void GeomObjekt::zeigeWerte()
{
	cout << endl;
	cout << name << endl;
	cout << "  X = "<< xpos << endl;
	cout << "  Y = "<< ypos << endl;
}

double GeomObjekt::umfangBerechnung(double a, double b, double d)
{
	if( (a > 0) && (b == 0) && (d == 0))
	{
		U = 4 * a;
	}
	
	else if( (a > 0) && (b > 0) && (d == 0) )
	{
		U = ( (2*a) + (2*b) );
	}

	else if( (a == 0) && (b == 0) && (d == 0) )
	{
		U = 0;
	}

	else if( ( a == 0) && (b == 0) && (d > 0) )
	{
		double r;
		r = d / 2;
		U = (2 * 3.14159 * r);
	}

	return U;
}

double GeomObjekt::flaechenBerechnung(double a, double b, double d)
{
	if( (a > 0) && (b == 0) && (d == 0) )
	{	
		A = a * a;
	}

	else if( (a > 0) && (b > 0) && (d == 0) )
	{
		A = a * b;
	}
	
	else if( (a == 0) && (b == 0) && (d == 0) )
	{
		A = 0;
	}

	else if( ( a == 0) && (b == 0) && (d > 0) )
	{
		double r;
		r = d / 2;
		A = 3.14159 * (r * r);
	}

	return A;
}

/********** Getter und Setter **************/
double GeomObjekt::getXpos()
{
	return xpos;
}

void GeomObjekt::setXpos(double Xpos)
{
	xpos = Xpos;
}

double GeomObjekt::getYpos()
{
	return ypos;
}

void GeomObjekt::setYpos(double Ypos)
{
	ypos = Ypos;
}

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

void GeomObjekt::setName(std::string Name)
{
	name = Name;
}

std::string GeomObjekt::getColor()
{
	return std::string(color);
}

void GeomObjekt::setColor(std::string Color)
{
	color = Color;
}

double GeomObjekt::getU()
{
	return U;
}

void GeomObjekt::setU(double u)
{
	U = u;
}

double GeomObjekt::getAFlaeche()
{
	return A;
}

void GeomObjekt::setAFlaeche(double a)
{
	A = a;
}

double GeomObjekt::getA()
{
	return a;
}

void GeomObjekt::setA(double A)
{
	a = A;
}

double GeomObjekt::getB()
{
	return b;
}

void GeomObjekt::setB(double B)
{
	b = B;
}

Klasse: Kreis.cpp
C++:
#include "Kreis.h"
#include <iostream>

using namespace std;

Kreis::Kreis()
{
	d = 0.0;
}

double Kreis::getDK()
{
	return d;
}

void Kreis::setDK(double D)
{
	d = D;
}

Klasse: Rechteck
C++:
#include "Rechteck.h"
#include <iostream>

using namespace std;

Rechteck::Rechteck()
{
	a = 0;
	b = 0;
}

double Rechteck::getAR()
{
	return a;
}

void Rechteck::setAR(double A)
{
	a = A;
}

double Rechteck::getBR()
{
	return b;
}

void Rechteck::setBR(double B)
{
	b = B;
}
Tut mir leid, wenns soviel Code ist oder wenn ich dich missverstanden habe:)

Gruß
Manda
 
Was wäre wenn man es auf 10Objekte erstmal festlegt?
Bsp:
GeomObjekt * Objekte[10];
Objekt[0]=&Kreis;
cout << Objekt[0]->ausgabe()

Das Problem wäre wieder, wenn ich mehrere Kreise habe, dann müsste ich ja sowas machen:
Objekt[1] = &Kreis;

Jemand eine idee?

Gruß
Manda
 
Was wäre wenn man es auf 10Objekte erstmal festlegt?
Das Problem ist das man erstmal den zugrundeliegenden Code aufräumen müßte. Das ist alles relativ verworren.

Was wird denn z.B. in der GeomObjekt::umfangBerechnung Methode für Zeug berechnet? Jedes Objekt sollte doch eine eigene (Version der) berechneUmfang Methode haben. Und GeomObjekt Methode sollte rein virtuell sein, oder?!

Es hat eigentlich keinen Sinn, da jetzt am anderen Ende bei der Ausgabe irgendwie rumzudoktoren, wenn am Anfang der Hase im Pfeffer liegt.

Wenn wir jetzt noch genau wüßten was du überhaupt machen sollst, dann könnte man ja da ansetzen...

Gruß
 
In " double GeomObjekt::umfangBerechnung(double a, double b, double d) "
berechne ich Umfang für alle Objekte. Ein Punkt hat ja keinen Umfang, deswegen wäre der Aufruf von der main() aus "U = objekt[1].umfangBerechnung(0, 0, 0); "
Da gebe ich einfach 0 0 0 als Parameter mit.

Für Rechteck, gebe ich ihm dann a und b mit, da ich da ja einen Umfang berechnen kann.
Für Kreis, gebe ich nur durchmesser d mit. Dann wäre dafür a=0 und b = 0.
Das frage ich dann mit den if-else ab und gebe den jeweils betreffenden Wert zurück.

Hoffe ich habs einigermaßen gut erklären können.

Kannst du mir sagen was du mit "virtuell" meinst?
 
Zurück