Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Programmierung 2 » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Seiten (13): « erste ... « vorherige 3 4 [5] 6 7 nächste » ... letzte » Neues Thema erstellen Thema ist geschlossen
Zum Ende der Seite springen Programmierung 2
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Victor
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ja großes Grinsen

In der Aufgabe steht ja rechteck ausgeben mit operator <<

Ist damit einfach das cout << rect1 ---- gemeint ?
Oder wollen die was anderes ?


bool CRectangle::operator ==(const CRectangle& other) const
{
// Bitte implementieren und dabei das return-Statement ersetzen.
return false;
}

Soll ich bei dieser obigen Funktion jetzt einfach

other == rect1 vergleichen ?
Und wenn es gleich ist , rect 1 zurück geben ?
08.09.2017 00:50
Victor
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hier meine Idee.

Ich glaube du bist pennen gegangen großes Grinsen


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:

bool CRectangle::operator ==(const CRectangle& other) const
{
	if(other== this->CRectangle()){
		
		cout << this << endl;
	}
	return false;
}



Passt die h) so?
08.09.2017 01:01
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 639
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ich weiß auch nicht, jede weitere Fragen von Dir zeigt mir einfach nur, dass Du überhaupt gar nicht verstehst, um was es eigentlich geht. Glaubst Du wirklich, das bringt etwas dann?

Nein, Du kannst natürlich im Vergleichsoperator operator== nicht einfach die beiden Objekte mit == vergleichen. Gerade das soll doch erst Deine Implementation des Vergleichsoperator ermöglichen. Und nein, der soll narürlich selbst gar keine Ausgabe haben, eigentlich haben die Operator-Implementationen selbst nie eine Ausgabe (wäre sehr ungewöhnlich). Auch der operator<< hat kein cout drin stehen und gibt deshalb selbst nichts aus.
Aber das sind alles einfachste Grundlagen, die man zuerst dann lernt, wenn man überhaupt etwas über Operatorüberladung lernt, was auch schon nicht das erste ist, was man lernt. Du versuchst aber schon viel weiter hinten einzusteigen, obwohl Du von dem vorher noch gar nichts verstanden hast.

Im operator== musst Du definieren, wann zwei Objekte des von Dir ja auch neu kreierten Typs CRectangle als identisch zu betrachten sein sollen. Das kann der Compiler ja sonst noch gar nicht wissen. Das kann je nach Klasse unter Umständen ja recht kompliziert sein, so etwas zu ermitteln.
Wir haben es jedoch einfach und es steht ja sogar schon in der Aufgabe: zwei Rechtecke sind genau dann gleich, wenn beide Eckpunkte und das Füllzeichen alle auch übereinstimmen.
Wenn das der Fall ist, soll mit return true; wahr zurück gegeben werden, sonst false.

Schau Dir doch als Beispiel den bei dieser Aufgabe schon ausimplementierten operator== für die Klasse CPoint an. Da Steht einfach:
code:
1:
2:
3:
4:
bool CPoint::operator ==(const CPoint& other) const
{
  return m_x == other.m_x && m_y == other.m_y;
}

Diese Klasse hat nur zwei Member, nämlich die Koordinaten x und y als m_x und m_y. Es wird nur wahr zurück gegeben, wenn beide in den beiden Objekten denselben Wert haben.
Das sollst Du hier für die 3 Membervariablen machen. Dabei ist der Vergleich von den beiden Eckpunkten ja schon in der Klasse CPoint implementiert, den verwendest Du also schon, wenn Du m_bottomLeft == m_topRight schreibst.

Aber nochmal: ich habe den Eindruck, dass Dir auch schon ganz grundsätzlich überhaupt nicht klar ist, was und vor allem warum wir das ganze überhaupt tun,mit den Klassen und so weiter. Ich denke das und noch viele andere grundlegende Dinge, auch grundlegende Syntax, etc, solltest Du zuerst einmal kapieren, bevor Du Dich an solche Aufgaben machst. Das hier ist doch einfach alles nur eine Quälerei ohne Nutzen. Zumindest ist es nicht effizient auf diese Art Programmieren zu lernen, denke ich.
Mein Tip: Nimm Dir ein gutes Buch oder entsprechendes aus dem Internet und arbeite das zuerst durch.

Gruß
Marco
08.09.2017 08:08 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Victor
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Diese Infos wusste ich gar nicht.
Das Problem ist das in der Vorlesung nichts erklärt wird und in der Klausur

Wunder erwartet werden .

Das Problem ist ,dass ich auch durch das Lesen von Büchern später beim Anwenden Probleme hab geschockt

Könnte ich es so machen?
code:
1:
2:
3:
4:
5:
6:
7:

bool CRectangle::operator ==(const CRectangle& other) const
{
	return m_topRight == other.m_topRight &&  m_bottomLeft == other.m_bottomLeft &&m_fillChar == other.m_fillChar;
}
08.09.2017 09:52
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 639
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ja, das ist schon viel besser! Daumen hoch
08.09.2017 11:22 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Victor
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hätte ich aber ganz links nicht die Variable einfach beliebig nennen können ?

Oder muss man es nach einer Variablen benennen die auch existiert ?
08.09.2017 12:19
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 639
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Du legst hier keine neue Variable an.

Also, vielleicht kann ich es doch versuchen zu erklären:
Dieser operator==() ist quasi wie eine Memberfunktion der Class CRectangle (Operator-Überladungen müssen nicht immer Mitglieder einer Klasse sein, aber das ist ein anderes Thema. Solche Vergleichsoperatoren sind es meistens).
Bei dieser speziellen Überladung hier mit dem == ist es z. B. so, dass es generell sehr ähnlich wie ein Memeberfunktions- oder Methoden-Aufruf. Dabei ist vor dem Operator ein Objekt einer Klasse und hinten dran auch ein Objekt, in diesem Fall derselben Klasse.
Der Aufruf ist jetzt, wie wenn das linke Objekt "this" ist und das rechte als Argument übergeben wird (hier dann other).
Allerdings musst Du üblicherweise ja "this" nicht explizit hinschreiben. Wenn man einfach einen Variablennamen anspricht, hier z. B. m_bottomLeft, dann ist das implizit this.m_bottomLeft, wenn man aber auf das andere m_bottomLeft zugreifen will, dann muss man "other." explizit davor schreiben.
Sinn der ganze Übung ist so:
Du willst quasi so eine Art eigene Datentypen definieren, ähnlich wie es schon int oder double oder so gibt, die aber ganz spezielle Dinge "können". Du willst also nicht nur die Daten an sich definieren, sondern dazu auch noch (in einem Paket quasi), wie man mit diesen Daten arbeiten muss, Du willst also Datenstruktur mit den Funktionen, die auf diesen Daten kapseln (man nennt das Kapselung).
Dafür machst Du Klassen, die sowohl die Datenstruktur definieren, als auch, wie man damit arbeitet.
Von solchen Klassen kannst Du verschiedene Objekte generieren, ähnlich wie Du vom Typ int auch mehrere Variablen anlegen kannst. Jedes Objekt hat zwar genau dieselben Funktionen und auch dieselben Variablen im Bauch, aber die Werte der Variablen (also die Daten an sich) können bei jedem Objekt unterschiedlich sein.
Du kannst Dir das vielleicht erstmal wie eine Tabelle vorstellen: Du hast verschiedene Spalten mit Spaltenüberschriften. Jede Zeile hat einen Datensatz, der für jede Spalte einen Wert definiert.
Du könntest z. B. die Punkte der CPoint-Klasse in einer Tabelle schreiben. Wir hatten ja einen bei (5, 5) und einen (25, 15) und glaube noch einen (20, 10) oder so. Da könntest Du schreiben:
code:
1:
2:
3:
4:
5:
6:
7:
   |  x  |  y  |
----------------
 1 |   5 |   5 |
 2 |  25 |  15 |
 3 |  20 |  10 |

Du hast also die Spaltenüberschriften als Teil der Klasse, der Satz von Werten in den Spalten sind aber jeweils ein Objekt.
Dazu kommen aber eben noch die Funktionen, die angeben, wie man mit diesen Werten arbeiten soll.

Außerdem muss man auch noch sagen, wann sind denn zwei Zeilen gleich? Das ist ja offenbar dann (und nur dann), wenn die Werte für beide Koordinaten gleich sind. Du willst die Möglichkeit haben, genau diesen Sachverhalt zu definieren.
Bei normalen (eingebauten) Datentypen, wie int oder double, kannst Du ja schreiben:
code:
1:
2:
3:
4:
int a = 2, b = 3;
if(a == b) { ... }

Das willst Du aber auch schreiben können, wenn Du Objekte des selbst definierten Typs (oder der selbst definierten Klasse) hast. Der Operator gibt ja offenbar einen boolschen Wert (also true oder false) zurück, damit man das gleich im "if" verwenden kann. Das muss der von uns definierte für die Klasse CRectangle dann auch, damit Du auch hier schreiben kannst:
code:
1:
2:
3:
4:
CRectangle a(CPoint(5, 5), CPoint(25, 15), 'x'), b(CPoint(10, 20), CPoint(20, 30));
if(a == b) {...}

Der Compiler weiß aber erst einmal nicht von alleine, was er denn genau machen muss, um die Gleichheit von a und b feststellen zu können. Also müssen wir den Operator überladen und es ihm erklären.

Deshalb ist Deine Frage irgendwie auch merkwürdig: Du benennst hier doch keine eigene Variable. m_bottomLeft ist die Membervariable des linken CRectangle Objekts und other.m_bottomLeft die des rechten. Die beiden willst Du ja vergleichen. Du benennst dann doch nicht hier eine Variable.
Außerdem: Das "m_" macht man hier vorne dran (das ist aber reine Konvention und man muss das nicht machen, bzw. viele machen das auch nicht), um zeigen zu können, diese Variable ist eine Member-Variable dieses Objekts uns nicht eine lokale oder sonstige Variable.

Hoffe Du liest Dir diesen Roman auch durch und es werden wenigstens ein paar Sachen klarer...

Gruß
Marco
08.09.2017 13:28 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Victor
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:

// GIT-Labor
// main.h

////////////////////////////////////////////////////////////////////////////////
// Header-Dateien
#include <iostream>		// Header f&#65533;r die Standard-IO-Objekte (z.B. cout, cin)
#include <stdlib.h>
// TODO: F&#65533;gen Sie hier weitere ben&#65533;tigte Header-Dateien der
// Standard-Bibliothek ein z.B.
// #include <string>

using namespace std;	// Erspart den scope vor Objekte der
						// C++-Standard-Bibliothek zu schreiben
						// z.B. statt "std::cout" kann man "cout" schreiben

// Inkludieren Sie hier die Header-Files Ihrer Klassen, z.B.
// #include "CFraction.h"
#include "CPoint.h"
#include "CRectangle.h"
#include "CScreen.h"


// Hauptprogramm
// Dient als Testrahmen, von hier aus werden die Klassen aufgerufen
int main (void)
{
    // TODO: Tragen Sie hier Ihren Namen, die Matrikelnummer und die Rechnernummer ein
	cout << "Name:, Matrikelnummer: <Matrikelnummer>" << endl ;
	CRectangle rectangle1;
	 rectangle1( CPoint(5, 5), CPoint(25, 15) );
	 cout << rectangle1;
	 
	 CRectangle rectangle2;
	 rectangle2( CPoint(10, 20), CPoint(15, 15) );



	return 0;
}


Teste jetzt die i) . Wieso gibt es jetzt Fehler ?
Wie teste ich das mit operator ==?
Description Resource Path Location Type
make: *** [main.o] Fehler 1 CRectangle C/C++ Problem
no match for call to ‘(CRectangle) (CPoint, CPoint)’ main.cpp /CRectangle line 30 C/C++ Problem
die Regel für Ziel „main.o“ scheiterte subdir.mk /CRectangle/Debug line 27 C/C++ Problem
09.09.2017 00:14
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 639
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Richtig:
code:
1:
CRectangle rectangle1(CPoint(5, 5), CPoint(25, 15));

Falsch:
code:
1:
2:
CRectangle rectangle1;
rectangle1(CPoint(5, 5), CPoint(25, 15));

auch hier habe ich wieder den Eindruck, Du weißt überhaupt nicht, was Du tust, oder?

Gruß
Marco

PS: Was alternativ noch ginge:
code:
1:
2:
CRectangle rectangle1;
rectangle1 = CRetangle(CPoint(5, 5), CPoint(25, 15));
09.09.2017 11:45 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Victor
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Also kann man es net Rectangle 2 nennen ?

Muss es Rectangle1 nennen ?
09.09.2017 14:45
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 639
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hä, willst Du mich auf den Arm nehmen?
Nein, was Du machst, ist deklarieren einer Variable und dann eine Art Aufruf eines Funktionsobjektes, das es nicht gibt, oder so.
Wenn Du die sog. direkte Initialisierung verwenden willst, geht das nur, wenn Du es direkt gleich bei der Deklaration mit machst!
09.09.2017 17:21 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Victor
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
// GIT-Labor
// main.h

////////////////////////////////////////////////////////////////////////////////
// Header-Dateien
#include <iostream>		// Header f&#65533;r die Standard-IO-Objekte (z.B. cout, cin)
#include <stdlib.h>
// TODO: F&#65533;gen Sie hier weitere ben&#65533;tigte Header-Dateien der
// Standard-Bibliothek ein z.B.
// #include <string>

using namespace std;	// Erspart den scope vor Objekte der
						// C++-Standard-Bibliothek zu schreiben
						// z.B. statt "std::cout" kann man "cout" schreiben

// Inkludieren Sie hier die Header-Files Ihrer Klassen, z.B.
// #include "CFraction.h"
#include "CPoint.h"
#include "CRectangle.h"
#include "CScreen.h"


// Hauptprogramm
// Dient als Testrahmen, von hier aus werden die Klassen aufgerufen
int main (void)
{
    // TODO: Tragen Sie hier Ihren Namen, die Matrikelnummer und die Rechnernummer ein
	cout << "Name:, Matrikelnummer: <Matrikelnummer>" << endl ;
	CRectangle rectangle1(CPoint(5, 5), CPoint(25, 15));
	CRectangle rectangle2(CPoint(10, 20), CPoint(15, 15));
	



	return 0;
}






Wie soll ich das mit operator == genau überprüfen ?
10.09.2017 12:20
Victor
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Noch da string?
11.09.2017 14:33
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 639
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Diese Woche kann ich nicht. Erst am Wochenende wieder, wahrscheinlich.
11.09.2017 22:06 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Victor
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Aber wenigstens ne Idee wie ich das mit operator== testen kann ?
11.09.2017 23:54
Seiten (13): « erste ... « vorherige 3 4 [5] 6 7 nächste » ... letzte » Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Thema ist geschlossen
Informatiker Board » Themengebiete » Praktische Informatik » Programmierung 2