Programmierung 2 - Seite 2 |
| 07.09.2017, 23:53 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | Keiner . Ich habe vielleicht eine Idee . Zuerst objekt anlegen :
jetzt koordinaten mit rectangle1.setCorner(.....);? |
|||||||||||||||
|
|
||||||||||||||||
| 07.09.2017, 23:54 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | Hab gerade nochmal geschaut: CPoint hat einen Konstruktor mit zwei Koordinaten. CRectangle hat verschiedene Konstruktoren, einer davon mit zwei Eckpunkten, einer mit zwei Eckpunkten und Füllzeichen und dann noch einen nur mit Füllzeichen. Also welcher Konstruktor soll denn eine Koordinate haben??? Das weißt schon, was ein Konstruktor ist, oder? |
|||||||||||||||
| 07.09.2017, 23:55 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | Nimm doch einfach den Konstruktor, wie ich es geschrieben hatte. |
|||||||||||||||
| 07.09.2017, 23:56 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor |
Woher weiss ich das dieser neue Cpoint 2 Koordinaten hat ? Das verstehe ich nicht ? Wo wurde das erstellt?
|
|||||||||||||||
| Anzeige | ||||||||||||||||
|
|
||||||||||||||||
| 07.09.2017, 23:57 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | Sorry, hab kacke geschrieben... Du brauchst kein new, einfach CRectangle rectangle1(...) |
|||||||||||||||
| 07.09.2017, 23:57 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | Ah jetzt peile ich es . Ich hätte einfach in der Klasse Cpoint gucken müssen
public: /** * Erzeugt ein neues Objekt mit den angegeben * Werten f�r die x- und y-Koordinate. */ CPoint(int x = 0, int y = 0); |
|||||||||||||||
| 08.09.2017, 00:00 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor |
So geht das nicht ? Wie meinst du es genau oben ? |
|||||||||||||||
| 08.09.2017, 00:09 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | OMG habe es jetzt
|
|||||||||||||||
| 08.09.2017, 00:10 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor |
|
|||||||||||||||
| 08.09.2017, 00:17 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | Mit einem leeren () wird Füllzeichen ausgegeben ?
|
|||||||||||||||
| 08.09.2017, 00:22 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | Nimm einfach Zeile 6 |
|||||||||||||||
| 08.09.2017, 00:23 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | So z. B.:
|
|||||||||||||||
| 08.09.2017, 00:25 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | Für das Füllzeichem muss ich doch einen anderen Konstruktor aufrufen oder ? Diesen: CRectangle::CRectangle(char fillChar) { m_fillChar = fillChar;} Wieso einfach Zeile 6 ? |
|||||||||||||||
| 08.09.2017, 00:28 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | Wenn Du ein Rechteck-Objekt erstellen wolltest, bei dem Du nur das Füllzeichen anders festlegst als der Standard "#", dann könntest Du diesen Konstruktor verwenden. Aber Du willst doch nur ein Rechteck mit den beiden Ecken konstruieren und nicht eines mit einem Füllzeichen, oder? |
|||||||||||||||
| 08.09.2017, 00:32 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | Ich habe zu erst mal eine frage . Rufst du da oben in der main diesen Konstruktor auf? CRectangle::CRectangle(CPoint bottomLeft, CPoint topRight, char fillChar) { m_fillChar = fillChar; m_bottomLeft = bottomLeft; m_topRight = topRight; if(topRight.getX() < bottomLeft.getX() ){ m_topRight.CPoint::setX(bottomLeft.getX()); } if(topRight.getY() < bottomLeft.getY()){ m_topRight.setY(bottomLeft.getY()); } } Ich dachte du rufst das hier von der CPOint Klasse auf? CPoint(int x = 0, int y = 0); Das muss mir zuerst klar werden ? Cpoint hat ja kein Füllzeichen oder doch? |
|||||||||||||||
| 08.09.2017, 00:33 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | In der Aufgabe steht doch und dem Füllzeichen ? |
|||||||||||||||
| 08.09.2017, 00:34 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | Vielleicht nochmal anders: Wenn Du ein Objekt vom Typ CRectangle machen willst, dann rufst Du dafür den Konstruktor nur einmal auf, und zwar indem Du
Wenn Du das für die Variable var_name einmal gemacht hast, dann verwendest Du nie wieder einen Konstruktor für diese Variable. Die ist ja jetzt schon da, da wird nichts mehr neues dann konstruiert. Wenn Du was am vorhandenen Objekt var_name später ändern willst (also nicht neu machen sondern ändern!), dann verwendest Du z. B. die setter-Methoden. Aber bei der g) willst Du nichts an einem Objekt ändern, sondern nur eines erstellen mit den Eckpunkten (5,5) und (25,15) und dem Füllzeichen '#', mehr nicht! |
|||||||||||||||
| 08.09.2017, 00:36 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | Erstens ist das Füllzeichen schon als Default auf '#' gesetzt und zweitens sollst Du alles drei in einem Objekt haben, sowohl die beiden Eckpunkte als auch das Füllzeichen. Wenn Du explizit ein Füllzeichen angeben willst (was Du hier nicht musst, weil es der Default ist), dann nimm den Konstruktor mit drei Argumenten! |
|||||||||||||||
| 08.09.2017, 00:37 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | Ja aber Rectangle hat ja 2 Konstruktoren . Hast du also das aufgerufen? CRectangle::CRectangle(CPoint bottomLeft, CPoint topRight, char fillChar) { m_fillChar = fillChar; m_bottomLeft = bottomLeft; m_topRight = topRight; if(topRight.getX() < bottomLeft.getX() ){ m_topRight.CPoint::setX(bottomLeft.getX()); } if(topRight.getY() < bottomLeft.getY()){ m_topRight.setY(bottomLeft.getY()); } } Kann ja nicht sein ,da ja dieser Konstruktor keine x und y Koordinate hat ? |
|||||||||||||||
| 08.09.2017, 00:45 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | x und y??? Nein, x und y ist doch gar kein Member von CRectangle sondern von CPoint! Warum sollte es dann einen Konstruktor mit x und y für das Rechteck geben. Nochmal: CRectangle hat einen Konstruktor mit zwei CPoint Objekten und einem Char als Füllzeichen. Letzteres ist mit dem "fillChar = '#'" in der Headerdatei auf einen Defaultwert gesetzt. Wenn Du also nur zwei CPoint in einem Konstruktor angibst, wird automatisch fillChar mit dem Defaultwert belegt. Du hast damit also eigentlich direkt zwei verschiedene Konstruktoren, einen mit zwei CPoint Objekten und einen mit zwei CPoint-Objekten und einem Char. Außerdem gibt es noch einen eigenen Konstruktor ohne CPoint Objekte aber mit einem (optionalen, weil auch hier ein Default angegeben ist) Füllzeichen. Ich verwende aber noch den Konstruktor CPoint(x, y), um zwei CPoint-Objekte anzugeben, die ich direkt dem Konstruktor von CRectangle übergebe. Du könntest auch explizit erst zwei CPoint-Objekte machen und damit das Rechteck konstruieren, etwa so:
Vielleicht macht es das klarer? |
|||||||||||||||
| 08.09.2017, 00:50 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | Ja
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, 01:01 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | Hier meine Idee. Ich glaube du bist pennen gegangen
Passt die h) so? |
|||||||||||||||
| 08.09.2017, 08:08 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | 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:
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, 09:52 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | 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
Könnte ich es so machen?
|
|||||||||||||||
| 08.09.2017, 11:22 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | Ja, das ist schon viel besser!
|
|||||||||||||||
| 08.09.2017, 12:19 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | 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, 13:28 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | 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:
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:
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:
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 |
|||||||||||||||
| 09.09.2017, 00:14 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor |
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, 11:45 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | Richtig:
Falsch:
auch hier habe ich wieder den Eindruck, Du weißt überhaupt nicht, was Du tust, oder? Gruß Marco PS: Was alternativ noch ginge:
|
|||||||||||||||
| 09.09.2017, 14:45 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | Also kann man es net Rectangle 2 nennen ? Muss es Rectangle1 nennen ? |
|||||||||||||||
| 09.09.2017, 17:21 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | 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! |
|||||||||||||||
| 10.09.2017, 12:20 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor |
Wie soll ich das mit operator == genau überprüfen ? |
|||||||||||||||
| 11.09.2017, 14:33 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | Noch da string? |
|||||||||||||||
| 11.09.2017, 22:06 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | Diese Woche kann ich nicht. Erst am Wochenende wieder, wahrscheinlich. |
|||||||||||||||
| 11.09.2017, 23:54 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | Aber wenigstens ne Idee wie ich das mit operator== testen kann ? |
|||||||||||||||
| 14.09.2017, 12:29 | Auf diesen Beitrag antworten » | |||||||||||||||
| Karlito | Die Zeit, die Du hier investierst um as_string die Lösung aus der Nase zu ziehen solltest Du besser investieren um zu verstehen, was Du da tun sollst und was dir hier erklärt wird. Offensichtlich hängt es bereits an den absoluten Grundlagen. Solltest Du dazu nicht in der Lage sein, lege ich dir einen Fachwechsel ans Herz. Besten Gruß, Karlito |
|||||||||||||||
| 14.09.2017, 13:36 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | Bitte string hilf mir trotzdem weiter
Ich will es nicht so schnell aufgeben |
|||||||||||||||
| 14.09.2017, 20:23 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | Ich versteh eigentlich schon Deine Frage nicht wirklich bzw. wo es eigentlich hängt. Angenommen Du wolltest testen, ob der schon fest eingebaute ==-Operator für integer-Variablen funktioniert wie gewünscht. Was könntest Du da beispielsweise machen? Ich würde zwei Variablen anlegen und sie einmal mit gleichen Ganzzahlen belegen und einmal mit ungleichen. Dann würde ich überprüfen, ob der Operator in den beiden Fällen sich wie erwartet verhält. Kennst Du eine Situation, bei der Du den ==-Operator häufig verwendest? Weißt Du überhaupt, was ein Operator ist und was dieser "==" bedeutet? Gruß Marco |
|||||||||||||||
| 15.09.2017, 19:05 | Auf diesen Beitrag antworten » | |||||||||||||||
| Victor | Ich weiss nicht wie ich die operator == FUnktion aufruft ? Wie macht man das ? Ich weiss nicht was operator == genau ist. Bin ehrlich
|
|||||||||||||||
| 15.09.2017, 23:52 | Auf diesen Beitrag antworten » | |||||||||||||||
| as_string | Schön, dass Du ehrlich bist, aber offenbar hast Du dann nicht viel von dem verstanden, was ich über Operatoren vorher schon so geschrieben hatte. Lies Dir nochmal durch, was ich 08.09.2017 13:28 geschrieben habe. Daraus musst Du doch ableiten können, was zu tun ist... Gruß Marco |
|||||||||||||||
|
|
Verwandte Themen
| Die Beliebtesten » |
| Die Größten » |
|
| Die Neuesten » |
|
