Hallo alle zusammen bin gerade an einer neuen Aufgabe tran.
Es soll eine Klasse CRectangle implementiert werden, die ein Rechteck
modelliert. Das Rechteck wird
durch die Eigenschaften „linke untere Ecke“, „rechte obere Ecke“ und ein
„Füllzeichen“ beschrieben, das
später für die graphische Darstellung (s. u.) verwendet wird. Die Klasse
CPoint zur Repräsentation
einer Koordinate ist bereits vorgegeben. Verändern Sie den Quellcode
dieser Klasse nicht! Die
Klassendefinition der Klasse CRectangle ist ebenfalls bereits
vorgegeben. Beachten Sie die Hinweise
in den Kommentaren der Klassendefinition.
Mir werden Fehler beim ersten Konstruktor angezeigt .
Habe gedacht ,dass ich erstmal nachfrage und versuche den Fehler zu
beseitigen :
a) Um Ihnen unnötige Tipp-Zeit zu ersparen, gibt es für alle Methoden
von CRectangle in der Datei CRectangle.cpp bereits unvollständige
„Rumpf-Implementierungen“. Wenn eine Methode einen Wert zurück gibt,
steht dort auch ein return-Statement mit einem DefaultWert. Ergänzen Sie
in den folgenden Teilaufgaben diese „Rumpf-Implementierungen“ und
ersetzen Sie ein evtl. bereits vorhandenes return-Statement durch den
korrekten Code.
b) Implementieren Sie die Konstruktoren. Berücksichtigen Sie bei dem
Konstruktor mit drei Parametern die im Kommentar beschriebenen
Zusicherungen (Datei CRectangle.h, Zeile 49ff.). Das Verhalten für den
Fall, dass ein Parameter die Zusicherung verletzt, ist ebenfalls im
Kommentar beschrieben.
c) Implementieren Sie die Methode setCorners unter Berücksichtigung der
im Kommentar beschriebenen Zusicherung. Das Verhalten für den Fall, dass
ein Parameter die Zusicherung verletzt, ist ebenfalls im Kommentar
beschrieben.
d) Implementieren Sie die Methoden getBottomLeftCorner und
getTopRightCorner.
e) Implementieren Sie die Methode setFillChar und getFillChar.
Header :
1
#ifndef ASCIISCREENSOLUTION_MYCODE_CRECTANGLE_H_
2
#define ASCIISCREENSOLUTION_MYCODE_CRECTANGLE_H_
3
4
#include <ostream>
5
using namespace std;
6
7
#include "CPoint.h"
8
#include "CScreen.h"
9
10
/**
11
* Diese Klasse beschreibt ein Rechteck in einem
12
* Ganzzahl-Koordinatensystem �ber die Eigenschaften
13
* "untere linke Ecke" und "obere rechte Ecke".
14
*
15
* Als zus�tzliche Eigenschaft hat die Klasse ein Zeichen
16
* (char) das bei der graphischen Darstellung als
17
* F�llzeichen verwendet wird.
18
*/
19
class CRectangle
20
{
21
private:
22
/** Die linke untere Ecke. */
23
CPoint m_bottomLeft;
24
/** Die rechte obere Ecke. */
25
CPoint m_topRight;
26
/** Das F�llzeichen f�r die graphische Darstellung. */
27
char m_fillChar;
28
29
public:
30
/**
31
* Erzeugt ein neues Rechteck mit linker unterer und
32
* rechter oberer Ecke bei (0,0) und dem angegebenen
33
* F�llzeichen.
34
*/
35
CRectangle(char fillChar = '#');
36
37
/**
38
* Erzeugt ein neues Rechteck mit der angegebenen linken
39
* unteren und rechten oberen Ecken sowie dem angegebenen
40
* F�llzeichen.
41
*
42
* Beim Erzeugen wird die Zusicherung �berpr�ft, dass die
43
* rechte obere Ecke rechts von und oberhalt der linken
44
* unteren Ecke liegen muss! Falls die x-Koordinate
45
* der rechten oberen Ecke nicht gr��er als die x-Koordinate
46
* der linken unteren Ecke ist, wird sie auf den Wert
47
* der x-Koordinate der linken unteren Ecke gesetzt. Falls
48
* die y-Koordinate der rechten oberen Ecke nicht gr��er als
49
* die y-Koordinate der linken unteren Ecke ist, wird sie auf
50
* dem Wert der y-Koordinate der linken unteren Ecke gesetzt.
// Bitte implementieren und dabei das return-Statement ersetzen.
75
return false;
76
}
77
78
void CRectangle::draw(CScreen& screen) const
79
{
80
// Bitte implementieren
81
}
Mein Konstruktor zeigt mir zu viele Fehler an ?
Ist es falsch implementiert ?
Description Resource Path Location Type
Symbol 'x_bottomLeft' could not be resolved CRectangle.cpp /CRectangle
line 30 Semantic Error
Symbol 'x_topRight' could not be resolved CRectangle.cpp /CRectangle
line 30 Semantic Error
Symbol 'y_topRight' could not be resolved CRectangle.cpp /CRectangle
line 35 Semantic Error
Symbol 'y_topRight' could not be resolved CRectangle.cpp /CRectangle
line 33 Semantic Error
Symbol 'y_bottomLeft' could not be resolved CRectangle.cpp /CRectangle
line 33 Semantic Error
Symbol 'y_bottomLeft' could not be resolved CRectangle.cpp /CRectangle
line 35 Semantic Error
Member 'm_fillChar' was not initialized in this constructor
CRectangle.cpp /CRectangle line 39 Code Analysis Problem
Symbol 'x_bottomLeft' could not be resolved CRectangle.cpp /CRectangle
line 28 Semantic Error
Symbol 'x_topRight' could not be resolved CRectangle.cpp /CRectangle
line 28 Semantic Error
Sind meine Zusicherungen falsch oder wie ?
Hulk H. schrieb:> Sind meine Zusicherungen falsch oder wie ?
Was könnte die Fehlermeldung denn bedeuten? Wo sind die Variablen
"x_topRight" usw. definiert?
b4d4u schrieb:> Da fehlt noch ein
Damit sich der offensichtliche Anfänger gleich furchtbare Hacks
angewöhnt, anstatt dieses triviale Problem auf die direkte simple Art zu
lösen?
Hulk H. schrieb:> Mein Konstruktor zeigt mir zu viele Fehler an ?
"zu viele"? Wie viele sollen es denn sein?
> Ist es falsch implementiert ?
Ganz offensichtlich ja. Sonst hättest du ja nur so viele Fehler wie
gewünscht. ;-)
> Description Resource Path Location Type> Symbol 'x_bottomLeft' could not be resolved CRectangle.cpp /CRectangle> line 30 Semantic Error
Weißt du, was diese Fehlermeldung auf Deutsch heißt? Was könnte sie dir
wohl sagen wollen?
// Bitte implementieren und dabei das return-Statement ersetzen.
73
return false;
74
}
75
76
void CRectangle::draw(CScreen& screen) const
77
{
78
// Bitte implementieren
79
}
Fehler
Description Resource Path Location Type
Symbol 'topRight' could not be resolved CRectangle.cpp /CRectangle
line 37 Semantic Error
Field 'x' could not be resolved CRectangle.cpp /CRectangle line 34
Semantic Error
Field 'y' could not be resolved CRectangle.cpp /CRectangle line 37
Semantic Error
Field 'y' could not be resolved CRectangle.cpp /CRectangle line 37
Semantic Error
Symbol 'bottomLeft' could not be resolved CRectangle.cpp /CRectangle
line 39 Semantic Error
Field 'y' could not be resolved CRectangle.cpp /CRectangle line 39
Semantic Error
Symbol 'bottomLeft' could not be resolved CRectangle.cpp /CRectangle
line 37 Semantic Error
make: *** [CRectangle.o] Fehler 1 CRectangle C/C++ Problem
Symbol 'topRight' could not be resolved CRectangle.cpp /CRectangle
line 32 Semantic Error
Member 'm_fillChar' was not initialized in this constructor
CRectangle.cpp /CRectangle line 43 Code Analysis Problem
Field 'y' could not be resolved CRectangle.cpp /CRectangle line 39
Semantic Error
‘x_bottomLeft’ was not declared in this scope CRectangle.cpp
/CRectangle line 28 C/C++ Problem
‘x_topRight’ was not declared in this scope CRectangle.cpp /CRectangle
line 28 C/C++ Problem
‘y_bottomLeft’ was not declared in this scope CRectangle.cpp
/CRectangle line 33 C/C++ Problem
‘y_topRight’ was not declared in this scope CRectangle.cpp /CRectangle
line 33 C/C++ Problem
die Regel für Ziel „CRectangle.o“ scheiterte subdir.mk
/CRectangle/Debug line 27 C/C++ Problem
Symbol 'bottomLeft' could not be resolved CRectangle.cpp /CRectangle
line 32 Semantic Error
Symbol 'bottomLeft' could not be resolved CRectangle.cpp /CRectangle
line 34 Semantic Error
Field 'x' could not be resolved CRectangle.cpp /CRectangle line 32
Semantic Error
Field 'x' could not be resolved CRectangle.cpp /CRectangle line 34
Semantic Error
Field 'x' could not be resolved CRectangle.cpp /CRectangle line 32
Semantic Error
Hulk H. schrieb:> Fehler
Ist doch schön, dass dir jemand sagt, wo die Fehler sind.
Jetzt musst du sie nur noch beheben. Ein Tipp: fang beim ersten an (und
beachte auch Warnungen, die evtl noch davor kommen), nachfolgende Fehler
könnten auch Folgefehler sein, die sich nach Beheben des ersten
automatisch lösen.
Als Tipp: den Prozess der während des Beheben der Fehler abläuft, nennt
man "Lernen".
In dem ich die defines höher gesetzt habe sind paar Fehler weg aber
immer noch viele da ?
Aber wenn das mit den defines blödsinn wo liegt dann der Fehler ?
1
#define topRight m_topRight
2
#define bottomLeft m_BottomLeft
3
#define x m_x
4
#define y m_y
5
#define private public
6
#include "CRectangle.h"
7
8
9
CRectangle::CRectangle(char fillChar)
10
11
{
12
m_fillChar = fillChar;
13
/**
14
* Erzeugt ein neues Rechteck mit der angegebenen linken
15
* unteren und rechten oberen Ecken sowie dem angegebenen
16
* F�llzeichen.
17
*
18
* Beim Erzeugen wird die Zusicherung �berpr�ft, dass die
19
* rechte obere Ecke rechts von und oberhalt der linken
20
* unteren Ecke liegen muss! Falls die x-Koordinate
21
* der rechten oberen Ecke nicht gr��er als die x-Koordinate
22
* der linken unteren Ecke ist, wird sie auf den Wert
23
* der x-Koordinate der linken unteren Ecke gesetzt. Falls
24
* die y-Koordinate der rechten oberen Ecke nicht gr��er als
25
* die y-Koordinate der linken unteren Ecke ist, wird sie auf
26
* dem Wert der y-Koordinate der linken unteren Ecke gesetzt.
// Bitte implementieren und dabei das return-Statement ersetzen.
76
return false;
77
}
78
79
void CRectangle::draw(CScreen& screen) const
80
{
81
// Bitte implementieren
82
}
Description Resource Path Location Type
make: *** [CRectangle.o] Fehler 1 CRectangle C/C++ Problem
in expansion of macro ‘x’ CRectangle.cpp /CRectangle line 34 C/C++
Problem
‘int CPoint::m_x’ is private within this context CRectangle.cpp
/CRectangle line 12 C/C++ Problem
‘m_BottomLeft’ was not declared in this scope CRectangle.cpp
/CRectangle line 11 C/C++ Problem
Field 'x' could not be resolved CRectangle.cpp /CRectangle line 36
Semantic Error
declared private here CPoint.h /CRectangle line 18 C/C++ Problem
in expansion of macro ‘x’ CRectangle.cpp /CRectangle line 36 C/C++
Problem
in expansion of macro ‘bottomLeft’ CRectangle.cpp /CRectangle line 34
C/C++ Problem
in expansion of macro ‘y’ CRectangle.cpp /CRectangle line 39 C/C++
Problem
‘int CPoint::m_y’ is private within this context CRectangle.cpp
/CRectangle line 13 C/C++ Problem
Field 'y' could not be resolved CRectangle.cpp /CRectangle line 41
Semantic Error
declared private here CPoint.h /CRectangle line 20 C/C++ Problem
in expansion of macro ‘bottomLeft’ CRectangle.cpp /CRectangle line 39
C/C++ Problem
in expansion of macro ‘y’ CRectangle.cpp /CRectangle line 41 C/C++
Problem
Symbol 'm_BottomLeft' could not be resolved CRectangle.cpp /CRectangle
line 38 Semantic Error
Symbol 'm_BottomLeft' could not be resolved CRectangle.cpp /CRectangle
line 36 Semantic Error
Symbol 'm_BottomLeft' could not be resolved CRectangle.cpp /CRectangle
line 41 Semantic Error
Field 'x' could not be resolved CRectangle.cpp /CRectangle line 38
Semantic Error
die Regel für Ziel „CRectangle.o“ scheiterte subdir.mk
/CRectangle/Debug line 27 C/C++ Problem
Field 'y' could not be resolved CRectangle.cpp /CRectangle line 43
Semantic Error
Symbol 'm_BottomLeft' could not be resolved CRectangle.cpp /CRectangle
line 43 Semantic Error
Member 'm_fillChar' was not initialized in this constructor
CRectangle.cpp /CRectangle line 47 Code Analysis Problem
Was benutzt du denn für eine IDE? Eclipse? Dann sind das vielleicht
einfach nur alte Fehlermeldungen, die du aus dem Fenster löschen kannst.
Oder du musst mal auf "Rebuild All" klicken.
g4u schrieb:> Die Defines müssen ganz an den Anfang von CRectangle.cpp, noch> vor:#include "CRectangle.h"
Das ist Blödsinn. Beheb das Problem, ohne #defines.
Nochwas: bei copy/paste ist nicht nur die Vorlage wichtig, sondern auch
wo man das dann reinkopiert. Schau mal den Block an in den die
Fehlermeldung gehört.
rmu schrieb:> Das ist Blödsinn. Beheb das Problem, ohne #defines.
Würde ich auch sagen. Lass dich nicht mit "gutgemeinten" aber unsinnigen
Tipps in die Irre führen.
Überleg mal (dir wird früher oder später sowieso nichts anderes übrig
bleiben) mit der gallertartigen Substanz zwischen den Ohren, was sowas
eigentlich macht:
#define private public
Tatsächlich sind durch das define die Fehler weg gegangen .
Das kannte ich bisher noch gar nicht .
In der Vorlesung hatten wir das noch nicht gemacht .
Meckert aber noch ein wenig rum ?
Aber wie würde es ohne define gehen ?
1
#include "CRectangle.h"
2
3
#define topRight m_topRight
4
#define bottomLeft m_bottomLeft
5
#define x m_x
6
#define y m_y
7
#define private public
8
CRectangle::CRectangle(char fillChar)
9
10
{
11
m_fillChar = fillChar;
12
/**
13
* Erzeugt ein neues Rechteck mit der angegebenen linken
14
* unteren und rechten oberen Ecken sowie dem angegebenen
15
* F�llzeichen.
16
*
17
* Beim Erzeugen wird die Zusicherung �berpr�ft, dass die
18
* rechte obere Ecke rechts von und oberhalt der linken
19
* unteren Ecke liegen muss! Falls die x-Koordinate
20
* der rechten oberen Ecke nicht gr��er als die x-Koordinate
21
* der linken unteren Ecke ist, wird sie auf den Wert
22
* der x-Koordinate der linken unteren Ecke gesetzt. Falls
23
* die y-Koordinate der rechten oberen Ecke nicht gr��er als
24
* die y-Koordinate der linken unteren Ecke ist, wird sie auf
25
* dem Wert der y-Koordinate der linken unteren Ecke gesetzt.
// Bitte implementieren und dabei das return-Statement ersetzen.
75
return false;
76
}
77
78
void CRectangle::draw(CScreen& screen) const
79
{
80
// Bitte implementieren
81
}
Description Resource Path Location Type
die Regel für Ziel „CRectangle.o“ scheiterte subdir.mk
/CRectangle/Debug line 27 C/C++ Problem
‘int CPoint::m_x’ is private within this context CRectangle.cpp
/CRectangle line 12 C/C++ Problem
declared private here CPoint.h /CRectangle line 18 C/C++ Problem
in expansion of macro ‘x’ CRectangle.cpp /CRectangle line 34 C/C++
Problem
in expansion of macro ‘bottomLeft’ CRectangle.cpp /CRectangle line 34
C/C++ Problem
‘m_BottomLeft’ was not declared in this scope CRectangle.cpp
/CRectangle line 11 C/C++ Problem
make: *** [CRectangle.o] Fehler 1 CRectangle C/C++ Problem
‘int CPoint::m_y’ is private within this context CRectangle.cpp
/CRectangle line 13 C/C++ Problem
in expansion of macro ‘x’ CRectangle.cpp /CRectangle line 36 C/C++
Problem
declared private here CPoint.h /CRectangle line 20 C/C++ Problem
in expansion of macro ‘y’ CRectangle.cpp /CRectangle line 39 C/C++
Problem
in expansion of macro ‘y’ CRectangle.cpp /CRectangle line 41 C/C++
Problem
in expansion of macro ‘bottomLeft’ CRectangle.cpp /CRectangle line 39
C/C++ Problem
Member 'm_fillChar' was not initialized in this constructor
CRectangle.cpp /CRectangle line 45 Code Analysis Problem
Das Problem ist das die Leute zwar sagen : Mach es ohne Define .
Aber nicht richtig sagen wie es gehen soll
Hulk H. schrieb:> Das Problem ist das die Leute zwar sagen : Mach es ohne Define .> Aber nicht richtig sagen wie es gehen soll
Das Problem ist, daß Du nicht aufgepaßt hast, deswegen mit Deinen
Hausaufgaben überfordert bist und statt das nachzuholen, was Du schon
hättest lernen sollen, jetzt in nem Forum Leute fragst, die Deine
Hausaufgaben machen sollen.
Das bringt Dir nichts, weil Du bei der nächsten Hausaufgabe auch nicht
weiterkommst, aus denselben Gründen.
Diese defines sind völliger Schwachsinn. Lösch die sofort alle wieder.
Lies die Compiler-Fehlermeldung und beheb das Problem ...
Du kannst nicht in deiner rectangle-Klasse auf private Member von Point
zugreifen, wofür hast du die Setter (setX, setY) gebaut?
Sven B. schrieb:> Diese defines sind völliger Schwachsinn. Lösch die sofort alle wieder.>> Lies die Compiler-Fehlermeldung und beheb das Problem ...> Du kannst nicht in deiner rectangle-Klasse auf private Member von Point> zugreifen, wofür hast du die Setter (setX, setY) gebaut?
Die set Klasse wurde so vorgegeben .
Es handelt sich um keine Hausaufgabe.
Es ist eine Altklausur woran ich übe.
Ich habe auch Cpoint.h in der cpp includiert .
ABer der Fehler geht trotzdem nicht weg?
Hulk H. schrieb:> Tatsächlich sind durch das define die Fehler weg gegangen .>> Das kannte ich bisher noch gar nicht .> In der Vorlesung hatten wir das noch nicht gemacht .>> Meckert aber noch ein wenig rum ?>
Die Defines müssen vor das:
1
#include "CRectangle.h
Dann gehen auch die restlichen Fehler weg.
> Das Problem ist das die Leute zwar sagen : Mach es ohne Define .>> Aber nicht richtig sagen wie es gehen soll
Ganz genau. Immer nur rummeckern, wenn man mal ein Define benutzt statt
lange nachzudenken, aber selber sind sie auch zu faul, die Aufgabe zu
lösen!
g4u schrieb:>> Aber nicht richtig sagen wie es gehen soll>> Ganz genau. Immer nur rummeckern, wenn man mal ein Define benutzt statt> lange nachzudenken, aber selber sind sie auch zu faul, die Aufgabe zu> lösen!
Ja, bin ich: das ist unnötig komplizierter und schwer lesbarer Code und
es lohnt sich nicht, darüber nachzudenken, weder für mich noch für den
TO. Den unnötig kompliziterten Quatsch löschen, dann schauen ob der
Fehler überhaupt noch da ist, und dann nachdenken ist die einzig
sinnvolle Strategie.
Also komm, da war selbst das #define private public vom Troll im Code
verbaut ...
Da keine brauchbare Hilfe kam ohne define zu machen .
So?
Soll ich diesen Teil in der Cpointh file zu public umwandeln um die
Fehler zu beseitigen?
class CPoint
{
private:
/** Die x-Koordinate (Spalte) */
int m_x;
/** Die y-Koordinate (Zeile) */
int m_y;
1
/*
2
* CRectangle.cpp
3
*
4
* Created on: 05.02.2015
5
* Author: lipp
6
*/
7
#define topRight m_topRight
8
#define bottomLeft m_bottomLeft
9
#define x m_x
10
#define y m_y
11
#include "CRectangle.h"
12
13
14
CRectangle::CRectangle(char fillChar)
15
16
{
17
m_fillChar = fillChar;
18
/**
19
* Erzeugt ein neues Rechteck mit der angegebenen linken
20
* unteren und rechten oberen Ecken sowie dem angegebenen
21
* F�llzeichen.
22
*
23
* Beim Erzeugen wird die Zusicherung �berpr�ft, dass die
24
* rechte obere Ecke rechts von und oberhalt der linken
25
* unteren Ecke liegen muss! Falls die x-Koordinate
26
* der rechten oberen Ecke nicht gr��er als die x-Koordinate
27
* der linken unteren Ecke ist, wird sie auf den Wert
28
* der x-Koordinate der linken unteren Ecke gesetzt. Falls
29
* die y-Koordinate der rechten oberen Ecke nicht gr��er als
30
* die y-Koordinate der linken unteren Ecke ist, wird sie auf
31
* dem Wert der y-Koordinate der linken unteren Ecke gesetzt.
// Bitte implementieren und dabei das return-Statement ersetzen.
81
return false;
82
}
83
84
void CRectangle::draw(CScreen& screen) const
85
{
86
// Bitte implementieren
87
}
Description Resource Path Location Type
make: *** [CRectangle.o] Fehler 1 CRectangle C/C++ Problem
‘int CPoint::m_x’ is private within this context CRectangle.cpp
/CRectangle line 12 C/C++ Problem
Member 'm_fillChar' was not initialized in this constructor
CRectangle.cpp /CRectangle line 44 Code Analysis Problem
declared private here CPoint.h /CRectangle line 18 C/C++ Problem
in expansion of macro ‘x’ CRectangle.cpp /CRectangle line 34 C/C++
Problem
‘int CPoint::m_y’ is private within this context CRectangle.cpp
/CRectangle line 13 C/C++ Problem
in expansion of macro ‘x’ CRectangle.cpp /CRectangle line 36 C/C++
Problem
declared private here CPoint.h /CRectangle line 20 C/C++ Problem
in expansion of macro ‘y’ CRectangle.cpp /CRectangle line 39 C/C++
Problem
in expansion of macro ‘y’ CRectangle.cpp /CRectangle line 41 C/C++
Problem
die Regel für Ziel „CRectangle.o“ scheiterte subdir.mk
/CRectangle/Debug line 27 C/C++ Problem
Hulk H. schrieb:> Da keine brauchbare Hilfe kam ohne define zu machen .
Du könntest Dich auch mal zehn Minuten lang hinsetzen und überlegen, was
diese #defines da eigentlich anstellen.
Sie kompensieren Deine Schreibfehler, dadurch, daß sie falsch
geschriebene Variablennamen durch die richtigen ersetzen. Das könntest
Du auch einfach selber machen, aber ... dazu müsstest Du verstehen,
worum es bei der ganzen Angelegenheit überhaupt geht.
> Soll ich diesen Teil in der Cpointh file zu public umwandeln um die> Fehler zu beseitigen?
Nein, Du sollst die Klasse so nutzen, wie es von ihrem Schöpfer
vorgesehen ist.
Das wurde Dir u.a. hier schon erklärt:
Beitrag "Re: C++ Programmierung"
Sven B. schrieb:> Also komm, da war selbst das #define private public vom Troll im Code> verbaut ...
Wieso Troll? Das beseitigt die restlichen Fehlermeldungen ...
Aber mal im Ernst @TE: Die #defines machen einfach nur eine
Textersetzung von deiner falschen Schreibweise in eine, die zumindest
keinen Compilerfehler auslöst. Mach diese Ersetzung mal von Hand, ohne
#define, wie Rufus es vorschlägt.
Falls der Code nach der Ersetzung keinen Sinn ergibt, dann schau mal in
CRectangle.h nach, was die beiden Konstruktoren unterscheidet und
welchen du gerade versuchst zu implementieren.
Lies ein Buch, beschäftige dich vernünftig damit und beheb die Fehler -
der Compiler gibt dir genug Hinweise.
Wird das nix, dann studier was anderes. Und ja, das meine ich absolut
ernst.
g4u schrieb:> Sven B. schrieb:>> Also komm, da war selbst das #define private public vom Troll im Code>> verbaut ...>> Wieso Troll? Das beseitigt die restlichen Fehlermeldungen ...
Weil "die Fehlermeldung geht dadurch weg" eine Programmierpraxis ist,
die jeder auch nur halbwegs ernstzunehmende Softwareentwickler in den
ersten fünf Minuten seiner Ausbildung ablegen sollte.
Hulk H. schrieb:> Aber wo ist die Hilfe geblieben von euch ?
Puh, ernsthafte Hilfe lautet in deinem Fall leider wieder einmal.
Arbeite dein Script durch. Du machst Grundlagenfehler.
Eine Hilfe in anderer Form kann nur bedeuten, dir die Klasse zu
korrigieren. Dabei lernst du nur nichts.
Weder deine Aufgabe ist anspruchsvoll, noch die Lösung dazu.
Hulk H. schrieb:> Aber wo ist die Hilfe geblieben von euch ?
Neben dem Getrolle kamen ziemlich viele hilfreiche Hinweise.
Nein, keiner hat Dich an die Hand genommen, Dir ein Lätzchen umgebunden
und dich Löffel für Löffel mit der nötigen Erkenntnis gefüttert -- aber
die relevanten Hinweise sind alle gegeben worden.
Sogar der "#define-Troll" hat zu erkennen gegeben, was er mit seiner
"Trollerei" vorhatte (er wurde nur recht gründlich missverstanden).
Also ich habe damals angefangen, dass ich mir ein Buch gekauft habe.
Kernighan/Ritchie bzw Stroustrup.
Dann legt man los und implementiert die Beispiele nach. Angefangen mit
den 3-Zeilern bis zu komplexerem Code. Dabei lernt man die Element der
Sprache kennen. Aber auch den Compiler. Man lernt, welche Fehler in
welcher Fehlermeldung münden, und wo man dann suchen muss.
z.B. steht am Anfang einer Fehlermeldung immer eine Zeilennummer.
Ich denke, dieses Vorgehen würde immer noch Sinn machen: erst mal mit
kleinen Programmen anfangen und sich ein bisschen mit dem Compiler
beschäftigen.
Alles das benötigt natürlich eine gewisse Zeit. Am K/R habe ich eine
ganze Weile gesessen. Und auch virtelle Funktionen und Templetes haben
sich erst nach langer Zeit für mich voll erschlossen. Bis dahin ist viel
üben angesagt.
// Bitte implementieren und dabei das return-Statement ersetzen.
75
return false;
76
}
77
78
void CRectangle::draw(CScreen& screen) const
79
{
80
// Bitte implementieren
81
}
Description Resource Path Location Type
make: *** [CRectangle.o] Fehler 1 CRectangle C/C++ Problem
‘class CPoint’ has no member named ‘x’ CRectangle.cpp /CRectangle
line 34 C/C++ Problem
‘class CPoint’ has no member named ‘y’ CRectangle.cpp /CRectangle
line 39 C/C++ Problem
‘class CPoint’ has no member named ‘x’ CRectangle.cpp /CRectangle
line 36 C/C++ Problem
‘class CPoint’ has no member named ‘y’ CRectangle.cpp /CRectangle
line 41 C/C++ Problem
die Regel für Ziel „CRectangle.o“ scheiterte subdir.mk
/CRectangle/Debug line 27 C/C++ Problem
Field 'x' could not be resolved CRectangle.cpp /CRectangle line 34
Semantic Error
Field 'x' could not be resolved CRectangle.cpp /CRectangle line 36
Semantic Error
Field 'x' could not be resolved CRectangle.cpp /CRectangle line 34
Semantic Error
Member 'm_fillChar' was not initialized in this constructor
CRectangle.cpp /CRectangle line 32 Code Analysis Problem
Field 'y' could not be resolved CRectangle.cpp /CRectangle line 39
Semantic Error
Field 'x' could not be resolved CRectangle.cpp /CRectangle line 36
Semantic Error
Field 'y' could not be resolved CRectangle.cpp /CRectangle line 41
Semantic Error
Field 'y' could not be resolved CRectangle.cpp /CRectangle line 39
Semantic Error
Field 'y' could not be resolved CRectangle.cpp /CRectangle line 41
Semantic Error
Zu viele Fehler Mist
Hulk H. schrieb:> class CPoint> {> private:> /** Die x-Koordinate (Spalte) */> int m_x;> /** Die y-Koordinate (Zeile) */> int m_y;Hulk H. schrieb:> Kann man das nicht so mit .x benutzen ?> Wie soll man es sonst machen?
1. CPoint hat kein Attribut mit dem Bezeichner x bzw. y. Die heissen
m_x bzw. m_y
2. Nein, da kannst du ausserhalb von CPoint nicht einfach mit .m_x bzw.
.m_y drauf zugreifen, denn die beiden Attribut sind private.
>> Scheint aber auch nicht zu helfen ?
Das englische Wort "to set" heißt soviel wie "setzen". Eine
Setter-Methode setX() setzt also einen Wert, vermutlich den der
Variable "x". Du willst Deine Daten in den if-Abfragen aber nicht
setzen, sondern? Genau. Und eine Setter-Funktion erwartet üblicherweise
auch keine Zuweisung, sondern die Übergabe eines Parameters.
Die erste If-Abfrage würde also etwa lauten:
// Bitte implementieren und dabei das return-Statement ersetzen.
71
return false;
72
}
73
74
void CRectangle::draw(CScreen& screen) const
75
{
76
// Bitte implementieren
77
}
Noch diese Fehler zu beseitigen ?
Eclipse meckert auch nur rum.
Description Resource Path Location Type
no matching function for call to ‘CPoint::setX()’ CRectangle.cpp
/CRectangle line 34 C/C++ Problem
candidate: void CPoint::setX(int) CPoint.h /CRectangle line 32 C/C++
Problem
candidate expects 1 argument, 0 provided CPoint.h /CRectangle line
32 C/C++ Problem
no matching function for call to ‘CPoint::setY()’ CRectangle.cpp
/CRectangle line 39 C/C++ Problem
make: *** [CRectangle.o] Fehler 1 CRectangle C/C++ Problem
no matching function for call to ‘CPoint::setX()’ CRectangle.cpp
/CRectangle line 36 C/C++ Problem
die Regel für Ziel „CRectangle.o“ scheiterte subdir.mk
/CRectangle/Debug line 27 C/C++ Problem
candidate: void CPoint::setY(int) CPoint.h /CRectangle line 37 C/C++
Problem
candidate expects 1 argument, 0 provided CPoint.h /CRectangle line
37 C/C++ Problem
no matching function for call to ‘CPoint::setY()’ CRectangle.cpp
/CRectangle line 41 C/C++ Problem
Kannst du Englisch?
Da steht Klipp und klar dein setirgendwas erwartet ein Argument, aber du
bist zu unfähig das zu liefern.
Änder was daran und du und der Compiler werden irgendwann Freunde.
Hulk H. schrieb:> Eclipse meckert auch nur rum.
Mit der Einstellung wird das nie was, weil Du Fehlermeldungen nur als
lästiges Generve siehst, aber nicht einmal den Versuch unternimmst, zu
begreifen, was sie Dir sagen wollen und was Du daher tun mußt.
Wenn Du an Deiner Einstellung nicht ganz grundlegend was änderst, wirst
Du diesen Kurs nicht bestehen.
Jetzt klappt es ohne Fehlermeldung .
Kann ich die Zuweisung so vor der If Bedingung machen ?
m_fillChar = fillChar;
m_bottomLeft = bottomLeft;
m_topRight = topRight;
1
* CRectangle.cpp
2
*
3
* Created on: 05.02.2015
4
* Author: lipp
5
*/
6
7
#include "CRectangle.h"
8
#include "CPoint.h"
9
CRectangle::CRectangle(char fillChar)
10
11
{
12
m_fillChar = fillChar;
13
/**
14
* Erzeugt ein neues Rechteck mit der angegebenen linken
15
* unteren und rechten oberen Ecken sowie dem angegebenen
16
* F�llzeichen.
17
*
18
* Beim Erzeugen wird die Zusicherung �berpr�ft, dass die
19
* rechte obere Ecke rechts von und oberhalt der linken
20
* unteren Ecke liegen muss! Falls die x-Koordinate
21
* der rechten oberen Ecke nicht gr��er als die x-Koordinate
22
* der linken unteren Ecke ist, wird sie auf den Wert
23
* der x-Koordinate der linken unteren Ecke gesetzt. Falls
24
* die y-Koordinate der rechten oberen Ecke nicht gr��er als
25
* die y-Koordinate der linken unteren Ecke ist, wird sie auf
26
* dem Wert der y-Koordinate der linken unteren Ecke gesetzt.
Ja, das kann man so machen.
Zu deiner Abfrage. Wäre es nicht sinvoller topright und botleft zu
tauschen, wenn die Bedingungen erfüllt sind? Zur Zweit veränderst du ja
dann einfach die Geometrie deines Rechteckes. Das ist kein schönes
Verhalten.
PS: Wie bescheuert ist dass denn. Das ist das erste mal, dass ich lese,
das die Ecken unten links und oben rechts angegeben werden. Na ja,
hauptsache anders. Manche Leute halt...... (das war nichts gegen den TE.
Der sagt, ja dass das ein Script ist.)
Wenn das ein eh nur eine Übung ist, solltest du eine Startposition
angeben und eine Spanne, wie groß das Rechteck ist. Dann bist du von der
Lage des Koordinatensystems unabhängig.
Das ist gar nicht mal so theoretisch. Das kartesische Koordinatensystem
hat seinen 0Punkt im ersten Quadranten ja unten links. Das
Koordinatensystem beim Zeichen auf dem Monitor hat seinen Nullpunkt oben
links und geht positiv nach "unten".
nicht"Gast" schrieb:> Das ist das erste mal, dass ich lese,> das die Ecken unten links und oben rechts angegeben werden. Na ja,> hauptsache anders. Manche Leute halt......
So machts zum Beispiel auch Adobe - PostScript hat den Ursprung unten
links.
Ciao, Martin
Hulk schrieb:> Warum soll man botLeft und topRight tauschen ?
Im Grunde finde ich beides nicht schön. Der TE schaut ja, ob die Ecken
auch da sind, wo sie laut Namen sein sollten. Wenn das nicht der Fall
ist, verändert er die Geometrie des Rechtecks. Das ist eigentlich nicht
so schön, weil man da ne Weile nach Fehlern suchen kann.
Da ist die Kombination Position/Größe um einiges schöner.
Martin H. schrieb:> nicht"Gast" schrieb:>> Das ist das erste mal, dass ich lese,>> das die Ecken unten links und oben rechts angegeben werden. Na ja,>> hauptsache anders. Manche Leute halt......>> So machts zum Beispiel auch Adobe - PostScript hat den Ursprung unten> links.
richtig, aber nicht nach der Nummer "Ecke rechts unten"/"Ecke links
oben" sondern auch nach Größe/Endpunkt. Wo sich dann letzten Endes der
Bezugpunkt befindet ist Egal.
Mal aus der Seite Kopiert, bei der ich nachgeschaut habe:
x y w h rectstroke draw a rectangle of width w, height h, and lower left
endpoint (x,y).
Die Seite:
https://www.cs.duke.edu/courses/fall03/cps100/assign/recursivegraph/postscript-help.htm
Ich versuche jetzt gerade den operator zu implementieren ?
Dafür muss ich doch zuerst den Konstruktor Aufbau ändern oder ?
weil er hat normalerweise ja nur bottomLeft , topRight , fillChar
.
Ich will ja auch auf die x und y Koordinate zu greifen ?
Irgendwie so?
Was wäre davon zu halten, wenn Du im Unterricht etwas aufmerksamer
wärst, und Deine Fragen Deinem Lehrer stellst?
Dieses Forum dient nicht der Nachhilfe, und schon gar nicht dem Lösen
von Hausaufgaben.
Im übrigen plenkst Du.
Meine Idee wäre das es irgendwie so aussehen sollte?
Ich weiss das hier paar fehler drin sind ,aber was soll ich machen .
Bin kein Experte beim proggen.
Hulk H. schrieb:> Meine Idee wäre das es irgendwie so aussehen sollte?>> Ich weiss das hier paar fehler drin sind ,aber was soll ich machen .>> Bin kein Experte beim proggen.
Man braucht zum Programmieren eine gewisse Struktur beim Denken. Einfach
irgendwas zusammengemurxtes hinschreiben bringts nicht. Vor allem ist es
notwendig, eine Zeile von dem C++ Code mental analysieren und in
einzelne Komponenten ("Statements", "Ausdrücke", ...) zerlegen zu
können, und auch den globalen Kontext der Zeile zu behirnen, also z.B.
ob die Zeile Teil einer Methoden- oder Funktionsdefinition ist, oder was
auch immer.
Unter dieser Voraussetzung würde ich zuallererst mal rausfinden, wozu
dieses "operator<<" überhaupt gut sein soll, d.h. was das genau tut und
wie es verwendet wird. Dazu ein kleines Testprogramm schreiben, wird
sowieso in der nächsten Aufgabenstellung fällig.
Sobald das mal läuft lässt sich dann auch (leicht) verifizieren, ob der
Effekt von "<<" den Vorgaben der Angabe entspricht. Man kann dann auch
vernünftigere Fragen stellen so à la "wenn ich ZYX mache erwarte ich
ABC, aber es passiert ABc, was übersehe ich", die lassen sich
vernünftiger beantworten.
Hulk H. schrieb:> Ich weiss das hier paar fehler drin sind ,aber was soll ich machen .
Im Unterricht aufpassen und den Lehrer fragen. Oder Dir Nachhilfe
suchen. Du kannst beispielsweise im Forum nachfragen, ob es einen
C++-Programmierer gibt, der Dir Nachhilfe gibt. Gegen Geld, oder Du
könntest ihm dafür die Gartenarbeit erledigen.
Oder natürlich die Triviallösung: bei dem Kurs einfach durchfallen.
Sollte dieser Kurs unbedingt notwendig sein, dann such Dir eine
Richtung, bei der Du so einen Kurs nicht hast.
Aber nicht sich die Hausaufgaben per Forum erledigen lassen.
Hulk H. schrieb:> Vor allem beim letzten Teil mit fillchar bin ich mir nicht sicher ?
inwiefern kann man sich da unsicher sein? ausprobieren! es wird nichts
kaputt. vermutlich fehlt aber noch ein paar '
Auch mit der Gefahr, dass mich die Moderatoren wieder löschen:
Lass das Programmieren sein! Es ist nicht deine Welt.
Ein Programmierer muss die Handbücher lesen.
Ein Programmierer mit die Compiler-Antworten verstehen und
interpretieren.
Ein Programmierer muss auch sein Programm debuggen, sei es mit printf
oder einem Debugger.
Ein Programmierer spielt auch mal mit dem Programm herum, Guckt was
passiert wenn er Sturkturen, Klassen verändert, bis es besser passt.
Alles Dinge, die du nicht kannst oder willst.
Man kann doch nicht jede Codezeile hier noch von jemand anderen
analysieren lassen, ohne bereit zu sein, sich selber um die Basics zu
kümmern.
An die Moderatoren: schließt endlich diesen gesamten Thread. Sonst wird
uns der TE noch Jahre mit seinen Rechtecken quälen.
PittyJ schrieb:> Lass das Programmieren sein! Es ist nicht deine Welt.>> Ein Programmierer muss die Handbücher lesen.> Ein Programmierer mit die Compiler-Antworten verstehen und> interpretieren.> Ein Programmierer muss auch sein Programm debuggen, sei es mit printf> oder einem Debugger.> Ein Programmierer spielt auch mal mit dem Programm herum, Guckt was> passiert wenn er Sturkturen, Klassen verändert, bis es besser passt.>> Alles Dinge, die du nicht kannst oder willst.> Man kann doch nicht jede Codezeile hier noch von jemand anderen> analysieren lassen, ohne bereit zu sein, sich selber um die Basics zu> kümmern.
Rom ist nicht an einem Tag erbaut worden. Am Anfang steht jeder
erschlagen da und muss sich erst mal zurechtfinden was wo wie wichtig
ist und zusammenhängt. "Herumspielen" und "Handbücher lesen" macht man
nicht eben so in 2h.
Gut bin jetzt ein wenig weiter gegangen mit meiner Aufgabe .
Bin jetzt gerade beim testen .
Wie soll ich das mit operator << ausgeben ?
Das Rechteck irgendwie mit this ausgeben ?
Wenn ich an manchen Stellen nicht weiter komme ,muss ich ja irgendwo
nachfragen oder ?
Man lernt ja programmieren durch proggen .
Nur durch Bücher wird es ja auch nicht besser.
Ich habe auch Bücher gelesen aber bei der Anwendung habe ich trotzdem
Probleme.
Wenn man an Stellen nicht weiter kommt und nachfragt , lernt man ja
auch.
Wenn mir jemand im Forum hier es mir erklärt wie es funzt dann verstehe
ich es doch auch gleichzeitig .
Hulk H. schrieb:> Wenn ich an manchen Stellen nicht weiter komme ,muss ich ja irgendwo> nachfragen oder ?
Ja. Aber nicht hier, sondern bei Deinem Lehrer.
> Man lernt ja programmieren durch proggen .
Nein. Dadurch lernt man es nicht.
Du plenkst übrigens immer schlimmer.
// GIT-Labor
// main.h
////////////////////////////////////////////////////////////////////////
////////
// Header-Dateien
#include <iostream> // Header f�r die Standard-IO-Objekte
(z.B. cout, cin)
#include <stdlib.h>
// TODO: F�gen Sie hier weitere ben�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
1
// Inkludieren Sie hier die Header-Files Ihrer Klassen, z.B.
2
// #include "CFraction.h"
3
#include "CPoint.h"
4
#include "CRectangle.h"
5
#include "CScreen.h"
6
7
8
// Hauptprogramm
9
// Dient als Testrahmen, von hier aus werden die Klassen aufgerufen
10
int main (void)
11
{
12
// TODO: Tragen Sie hier Ihren Namen, die Matrikelnummer und die Rechnernummer ein
Ich verstehe nicht warum eclipse dauernd meckert Mist?
Description Resource Path Location Type
make: *** [main.o] Fehler 1 CRectangle C/C++ Problem
expected initializer before ‘.’ token main.cpp /CRectangle line 30 C/C++
Problem
expected initializer before ‘.’ token main.cpp /CRectangle line 31 C/C++
Problem
stray ‘\302’ in program main.cpp /CRectangle line 32 C/C++ Problem
stray ‘\264’ in program main.cpp /CRectangle line 32 C/C++ Problem
die Regel für Ziel „main.o“ scheiterte subdir.mk /CRectangle/Debug line
27 C/C++ Problem
expected initializer before ‘.’ token main.cpp /CRectangle line 32 C/C++
Problem
Bei solchen Programmen kommt es wirklich auf jedes einzelne Zeichen an.
Irgendwo ein falschen Buchstabe -> syntax error oder ähnliches. Daher:
die Leertaste unter Kontrolle bekommen. Hochstelltaste und "Neue Zeile"
geht da auch gleich mit.
Ansonsten verweise ich auf den Film "Das Schweigen der Lämmer", genauer
gesagt auf die Stelle, wo Hannibal auf Marc Aurel verweist: "Oberste
Prinzipien Clarice. Simplifikation… lesen Sie bei Marc Aurel nach. Bei
jedem einzelnen Ding die Frage, was ist es in sich selbst? Was ist seine
Natur? Was tut er, dieser Fehler, den Sie suchen?"
Hulk H. schrieb:> CRectangle rectangle1.getBottomLeftCorner().getX(5).getY(5);> CRectangle rectangle2.getTopRightCorner().getX(25).getY(15);> CRectangle rectangle3.getFillChar();
Das ist quatsch. Google mal wie man in C++ Objekte erstellt.
Hulk H. schrieb:> rectangle1.getBottomLeftCorner().getX(5)>> Ich dachte in der x Koordinate 5 ausgeben ?
Dieser Satz macht keinen Sinn.
falls getX (noch) so
1
int CPoint::getX() const
2
{
3
return m_x;
4
}
implementiert ist dann liefert das m_x als Ergebnis. Argument nimmt getX
aber keines entgegen. Das const an dieser Stelle heisst, dass das Objekt
durch diese Methode nicht modifiziert wird / werden kann.
Klarerweise bemeckert der Compiler den Aufruf mit Argument.
Ich denke der Ablauf sollte sein
* CRectangle Objekt anlegen
* Koordinaten setzen
* Objekt ausgeben
Hulk H. schrieb:> ostream& operator<< (ostream& lhs, const CRectangle& rhs){> lhs << "CRectangle[(" << rhs.getBottomLeftCorner().getX() << "," << "> " << rhs.getBottomLeftCorner().getY() << ")" << "," << "(" <<> rhs.getTopRightCorner().getX() << " , "<<> rhs.getTopRightCorner().getY()<< " )"<< ","<< "fillChar";>> return lhs;> }
wie wird man einen operator wohl aufrufen?
lhs steht für "left hand side", rhs für "right hand side", also das
"linke" und das "rechte" argument des operators (<< in dem fall), ganz
links das was man wieder rauskriegt.
also in dem fall brauchts einen ostream und ein rectangle. cout ist ein
passender ostream, der gibt auf die standard-ausgabe aus, in dem code
oben legst du aus einem unerfindlichen Grund 3 CRectangle-Objekte an und
nennst alle "rectangle1", selbst wenn das durch den Compiler geht tut
das nicht das was man will. Also nur eines anlegen, Koordinaten setzen,
und ausgeben, analog zur Ausgabe der Matrikelnummer.
Ich lese hier immer Matrikelnummer.
Hast du keine Kommilitonen? Wie lösen die eigentlich die Aufgaben?
Versuch doch einfach mal ein Gespräch in der Mensa. Wenn man zu zweit
vor dem Rechner sitzt, dann geht es doch viel einfacher, als jedes
syntaktische Problem hier im Forum nachzufragen.