Forum: PC-Programmierung auf Methode in anderer Klasse zugreifen


von Johannes (Gast)


Lesenswert?

Hallo,
ich arbeite mich gerade in Klassenprogrammierung in C++ ein.
Dabei bin ich jetzt bei einem Problem angekommen, bei dem ich heute 
nicht weiter gekommen bin
1
class Punkt {
2
public:
3
  Punkt(double X = 0, double Y = 0) { x = X; y = Y; }
4
  void set(double X, double Y) { x = X; y = Y; }
5
  double getX() { return x; }
6
  double getY() { return y; }
7
private:
8
  double x;
9
  double y;
10
};
11
12
13
void main() {
14
  // Zwei Variablen vom Typ "Punkt" zur Eingabe der Rechteckkoordinanten
15
  Punkt A, B;
16
  // Eingabe der Koordinaten der Punkte A und B
17
  double x, y;
18
  std::cout << "Koordinaten x und y Punkt A : "; std::cin >> x >> y; A.set(x, y);
19
  std::cout << "Koordinaten x und y Punkt B : "; std::cin >> x >> y; B.set(x, y);
20
21
22
  // Erzeugen eines Objekts der Klasse "Rechteck" und
23
  // Berechnung des Umfangs und der Flaeche des Rechteckes
24
  Rechteck RE(A, B);
25
  std::cout << "Die Rechteckflaeche betraegt " << RE.Flaeche() << std::endl;
26
  double Umfang;
27
  RE.Umfang(Umfang);
28
  std::cout << "Der Umfang des Rechteckes betraegt " << Umfang << std::endl;
29
}

Aufgabe ist es nun die Klasse Rechteck zu Programmieren. Hierbei kommen 
aber nun die Probleme
1
class Rechteck{
2
public:
3
  Rechteck(double A, double B);
4
  double Flaeche() { return 50; }
5
  double Umfang(double umfang) { return 50; }
6
private:
7
  double flaeche;
8
  double umfang;
9
};

zunächst habe ich in der Funktion Flaeche() und Umfang() feste werte 
reingeschrieben. Das Problem liegt schon beim Aufruf
1
Rechteck RE(A, B);
Da A und B variablen vom Typ Punkt sind, kann ich die in der Klasse 
Rechteck nicht benutzen.
Wenn ich den Aufruf umänder in
1
Rechteck RE(10, 20);
funktioniert der Aufruf.
Dann habe ich versucht in der Klasse Rechteck die Funktion Flaeche zu 
ändern in
1
Rechteck(double A, double B) {flaeche = ((B.getX() - A.getX()) * (B.getY() - A.getY()));}
2
double Flaeche() {return flaeche;}
Aber auch hier gibt es einen Fehler:
expression must have class type.

kann mir hier jemand einen tip geben?

Johannes

von Hajo (Gast)


Lesenswert?

Der Konstruktor von Rechteck muss doch Punkt entgegen nehmen:
1
class Rechteck{
2
public:
3
  Rechteck(Punkt A, Punkt B);

von Rolf M. (rmagnus)


Lesenswert?

Johannes schrieb:
> Da A und B variablen vom Typ Punkt sind, kann ich die in der Klasse
> Rechteck nicht benutzen.

Warum solltest du die nicht benutzen können?

> kann mir hier jemand einen tip geben?

In deinem Rechteck musst du die beiden Punkte speichern. Dann kannst du 
in den Funktionen Flaeche() und Umfang() daraus die gewünschten Werte 
berechnen. Du brauchst einen Konstruktor, über den du die Punkte beim 
Erzeugen des Rechtecks übergeben kannst.

von Alex R. (itaxel)


Lesenswert?

Rechteck(A.getX(), B.getX());

von imonbln (Gast)


Lesenswert?

Dir wurden beide üblichen Weg schon genannt
1
class Rechteck{
2
public:
3
  Rechteck(Punkt A, Punkt B);

bzw.
1
Rechteck(A.getX(), B.getX());

üblich in C++ wäre wohl das erste vorallen wenn du dabei bist den Code 
gerade erst zu schreiben

du kannst auch sowas machen:
1
class Rechteck{
2
public:
3
  Rechteck(Punkt A, Punkt B);
4
  Rechteck(double A, double B);

Das nennt sich Methoden Überladen, an entscheidet der Compiler anhand 
der Parameter beim Aufruf welche der beiden Rechteckmethoden benutzt 
werden.

bzw warum double für die X/Y Koordinaten von Punkt. FloatingPoint 
Datentypen (so wie Double) haben immer denn Nachteil das sie dazu neigen 
ungenau zu werden. vielleicht besser int nehmen und Notfalls deinen User 
sagen das dein Koordinatensystem so wahlen das es immer ganze 
(vielleicht sehr große)  Zahlen sind. Also zum Beispiel in Milimeter 
Rechnen statt Meter und sich so die Komma Sparen. siehe hierzu 
https://de.wikibooks.org/wiki/C-Programmierung:_Sicherheit#Das_Problem_der_Reellen_Zahlen_.28Floating_Points.29 
(auch wenn es da zum C geht das Problem beleibt gleich)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.