Also, ich hatte eben angefangen, einen riesigen Text mit auseinandergefriemelten Quellcodeausschnitten zu schreiben, aber dann hab ich mir mein Programm nochmal angeschaut und gefunden, wie ich mein Problem lösen kann. Es geht im Prinzip um Eltern- und Kindklassen(das sollen wir benutzen können), und wie ich bei Aufruf einer allgemeinen Elternklasse Werte aus der Kindklasse darstellen lassen kann. Es geht darum, von verschiedenen Formen/Shapes(Rechteck, Dreieck, Trapez) die Werte für Flächeninhalt und Umfang auszugeben und vor allem eine variable Anzahl an Shapes festzulegen. Demnächst soll unser Programm auch noch in der Lage sein von einem Beliebigen Shape die werte wieder ausgeben zu können, und mit den zahlenwerten hat das auch funktioniert, allerdings wollte ich eben nicht nur "Form 1 hat area= 4 und perimeter=10", "Form 2 hat...", sondern "Dreieck 1 hat ...", "Rechteck 2 hat..." und so weiter ausgeben lassen, also einen String statt einer zahl. Ich kann nachfolgend mal meinen Quelltext posten, ich markiere das was ich eben geschrieben habe und das woran ich mich orientiert habe mal farbig...
Code:
#include<iostream>
#include<math.h>
using namespace std;
//Klasse Shape initialisieren --> Shape definiert die Form eines Objektes
class Shape
{
protected: //geschützte Attribute
float perimeter;
float area;
string type;
bool isCalculated;
virtual void calculate()=0;
public: //öffentliche Attribute der Klasse
float getPerimeter();
float getArea();
string getType();
Shape(); //Constructor --> Objekt einer Klasse Shape wird erstellt
~Shape(); //Destructor --> Objekt einer Klasse Shape wird zerstört
};
//Konstruktor für Shape deklarieren
Shape::Shape()
{
isCalculated = false;
}
//Destructor für Shape deklarieren
Shape::~Shape()
{
}
float Shape::getArea()
{
if (!isCalculated)
{
calculate();
}
return area;
}
float Shape::getPerimeter()
{
if (!isCalculated)
{
calculate();
}
return perimeter;
}
string Shape::getType()
{
if (!isCalculated)
{
calculate();
}
return type;
}
//================================================================================
// Rectangle
class Rectangle: public Shape
{
protected:
float base;
float height;
void calculate();
public:
Rectangle();
void setGeometry(float Rbase, float Rheight);
};
Rectangle::Rectangle()//konstruktor von rectangle
{
}
void Rectangle::calculate() //calculate-funktion von rectangle wird definiert
{
area = base * height;
perimeter = 2*base + 2*height;
isCalculated = true;
type = "Rectangle";
}
void Rectangle::setGeometry(float Rbase, float Rheight)
{
Rectangle::base = Rbase;
Rectangle::height = Rheight;
}
//================================= Class rechtwinkliges Dreieck
class rectTriangle: public Shape
{
protected:
float kathete1;
float kathete2;
void calculate();
public:
rectTriangle();
void setGeometry (float Kkathete1, float Kkathete2);
};
rectTriangle::rectTriangle()//Konstruktor für rectTraingle
{
}
void rectTriangle::calculate()
{
area = (kathete1 * kathete2)/2;
perimeter = (kathete1+kathete2+sqrt(kathete1*kathete1+kathete2*kathete2));
isCalculated = true;
}
void rectTriangle::setGeometry (float Kkathete1, float Kkathete2)
{
rectTriangle::kathete1 = Kkathete1;
rectTriangle::kathete2 = Kkathete2;
}
class Trapezoid: public Shape
{
protected:
float topside;
float botside;
float height;
void calculate();
public:
Trapezoid();
void setGeometry(float Ttopside, float Tbotside, float Theight);
};
Trapezoid::Trapezoid()//Konstruktor für Trapezoid
{
}
void Trapezoid::calculate()
{
area = ((topside + botside)/2)*height;
perimeter = 0;
isCalculated = true;
};
void Trapezoid::setGeometry(float Ttopside, float Tbotside, float Theight )
{
Trapezoid::topside = Ttopside;
Trapezoid::botside = Tbotside;
Trapezoid::height = Theight;
}
//Hauptprogramm
int main()
{
bool ende = true;
do
{
int number;
cout << "How many shapes do you want?" << endl;
cin >> number;
Shape *Memory[number];
int counter = 0;
bool viableInput = true;
do
{
do
{
cout << " What do you want to calculate?" << endl;
cout << " 1: Rectangle(area, perimeter) \n 2: rectangular Triangle(area, triangle) \n 3: Trapezoid(area only) \n";
int typeShape;
cin >> typeShape;
switch (typeShape)
{
case 1:
{
cout << "Set rectangle geometry:" << endl;
float rectA, rectB;
cout << "Height: "; cin >> rectA;
cout << "Length: "; cin >> rectB;
Rectangle *Rect = new Rectangle;
Rect->setGeometry(rectA, rectB);
Memory[counter]=Rect;
cout << "Rectangle " <<counter+1<< " Area: " << Rect->getArea() <<endl;
cout << "Rectangle "<<counter+1<< " Perimeter: " << Rect->getPerimeter() <<endl;
counter++;
}
break;
case 2:
{
cout << "Set rectangular triangle geometry:" << endl;
float triA, triB;
cout << "Kathete 1: "; cin >> triA;
cout << "Kathete 2: "; cin >> triB;
rectTriangle *rT = new rectTriangle;
rT->setGeometry(triA, triB);
Memory[counter]=rT;
cout << "Rectangle" <<counter+1<< " Area: " << rT->getArea() <<endl;
cout << "Rectangle "<<counter+1<<" Perimeter: " << rT->getPerimeter() <<endl;
counter++;
}
break;
case 3:
{
cout << "Set Trapezoid geometry:" <<endl;
float trapA, trapB, trapC;
cout << "Top side: "; cin >> trapA;
cout << "Bottom side: "; cin >> trapB;
cout << "Height: "; cin >> trapC;
Trapezoid *Trap =new Trapezoid;
Trap->setGeometry(trapA, trapB, trapC);
Memory[counter]=Trap;
Trap->setGeometry(trapA, trapB, trapC);
cout << "Trapeziod area: " << Trap->getArea() << endl;
cout << "Trapezoid perimeter not definable" <<endl;
counter++;
}
break;
default:
viableInput=false;
cout << "Please choose a given Shape! \n" ;
break;
}
}
while (counter<number);
}
while(!viableInput);
cout << "What do you want to do now? \n 1: do it again \n 2: display values again \n anything else: close" <<endl;
int shut;
cin >> shut;
switch(shut)
{
case 1:
{
ende= false;
}
break;
case 2:
{
int typeOut;
cout << "Which shapes informations do you want to have displayed again?" << endl;
cout << " 1: all \n 2: individual ones " << endl;
cin >> typeOut;
bool outrepeat=true;
do
{
switch(typeOut)
{
case 1:
{
int i=0;
do
{
cout << Memory[i]->getType() << " "<< i+1 <<" area: "<< Memory[i]->getArea()<<", perimeter: " << Memory[i]->getPerimeter()<<endl;
i++;
}
while (i<number);
}
break;
case 2:
{
}
break;
default:
{
cout << "Please choose an option!" <<endl;
outrepeat=false;
}
break;
}
}
while(!outrepeat);
}
default:
{
return 0;
}
break;
}
}
while(!ende);
return 0;
}
also es funktioniert jetzt, ich dachte am anfang, dass ich es irgendwie schaffen muss sowas wie einen "virtual string" einzufügen, wie ich dieses "virtual void calculate()" benutzt habe.. aber dann ist mir aufgefgallen, dass void ja gar nichts zurückgibt, sondern in Shape die werte von area und perimeter ändert, und dass ich das selbe im gleichen zuge ja auch mit einer string variable machen kann.. also das problem ist jetzt zumindest schonmal gelöst, fehlt halt noch code für die anderen fälle ;P wer will kann das programm ja mal ausprobieren zur besseren verständlichkeit, es funktioniert aber so wie ich es mir vorstelle grade nur mit "Rectangle" als Form.
aber da wir jede woche mehr mit dem programm machen sollen, wird das nicht die letzte frage gewesen sein, der nächste schritt ist dann irgendwie, das feld Memory[] dynamisch anlegen zu lassen falls man das so bezeichnet.. und da stehe ich momentan noch komplett auf dem schlauch.