C++ Error
-
Habe const eingebaut und fehler geht weg ?CPoint CRectangle::getBottomLeftCorner()const
{
return m_bottomLeft;
}Geht das?
-
Sag´ du´s mir, du hast den Quelltext und Compiler.
-
@Programmer33 wieso invalid overload oft endl? Wieso knallt man ein using namespace std; mitten zwischen die includes? Sollte man sowas nicht sparsam benutzen und wenn dann nur in .cpp. Oder besser gar nicht. Ich schreibe jetzt extra nicht das man std:endl eigentlich nur selten wirklich braucht.
Obwohl: ist an der stelle das endl vielleicht nützlich wg. verschachtelter Aufrufe? Frage an das Forum.
-
#ifndef ASCIISCREENSOLUTION_MYCODE_CRECTANGLE_H_ #define ASCIISCREENSOLUTION_MYCODE_CRECTANGLE_H_ #include <iostream> using namespace std; #include<string> #include"CScreen.h" #include "CPoint.h" /** * Diese Klasse beschreibt ein Rechteck in einem * Ganzzahl-Koordinatensystem ¸ber die Eigenschaften * "untere linke Ecke" und "obere rechte Ecke". * * Als zus‰tzliche Eigenschaft hat die Klasse ein Zeichen * (char) das bei der graphischen Darstellung als * F¸llzeichen verwendet wird. */ class CRectangle { private: CPoint m_bottomLeft; CPoint m_topRight; char m_fillChar; public: /** * Erzeugt ein neues Rechteck mit linker unterer und * rechter oberer Ecke bei (0,0) und dem angegebenen * F¸llzeichen. */ CRectangle(char fillChar = '#'); /** * Erzeugt ein neues Rechteck mit der angegebenen linken * unteren und rechten oberen Ecken sowie dem angegebenen * F¸llzeichen. * * Beim Erzeugen wird die Zusicherung ¸berpr¸ft, dass die * rechte obere Ecke rechts von und oberhalt der linken * unteren Ecke liegen muss! Falls die x-Koordinate * der rechten oberen Ecke nicht grˆfler als die x-Koordinate * der linken unteren Ecke ist, wird sie auf den Wert * der x-Koordinate der linken unteren Ecke gesetzt. Falls * die y-Koordinate der rechten oberen Ecke nicht grˆfler als * die y-Koordinate der linken unteren Ecke ist, wird sie auf * dem Wert der y-Koordinate der linken unteren Ecke gesetzt. */ CRectangle(CPoint bottomLeft, CPoint topRight, char fillChar = '#'); /** * Weist den Eigenschaften "linke untere Ecke" und "rechte obere * Ecke" neue Werte zu. * * Vor der Zuweisung wird die Zusicherung ¸berpr¸ft, dass die * rechte obere Ecke rechts von und oberhalt der linken * unteren Ecke liegen muss! Ist das nicht der Fall wird keines * der Attribute ver‰ndert. */ void setCorners (CPoint bottomLeft, CPoint topRight); /** * Liefert die linke untere Ecke des Rechtecks zur¸ck. */ CPoint getBottomLeftCorner() const; /** * Liefert die rechte obere Ecke des Rechtecks zur¸ck. */ CPoint getTopRightCorner() const; /** * Weist dem F¸llzeichen den angegebene Wert zu. */ void setFillChar(char fillChar = '#'); /** * Liefert den Wert des F¸llzeichens. */ char getFillChar() const; /** * Pr¸ft, ob die beiden Rechtecke in allen Eigenschaften ¸bereinstimmen. */ bool operator== (const CRectangle& other) const; /** * Zeichnet das Rechteck in das ¸bergebene Bildschirmobjekt. Das heisst, * es werden mit CScreen::setPoint die Werte aller "Punkte", die im * Bereich des Rechtecks liegen, auf das F¸llzeichen des Rechtecks gesetzt. */ void draw(CScreen& screen) const; /** * Gibt eine textuelle Darstellung des Rechtecks auf dem ¸bergebenen * Ausgabestrom aus. Das Format ist in der Aufgabenstellung beschrieben. */ friend ostream& operator<< (ostream& lhs, const CRectangle& rhs); }; ostream& operator<< (ostream& lhs, const CRectangle& rhs); #endif /* ASCIISCREENSOLUTION_MYCODE_CRECTANGLE_H_ */
cpp
#include<iostream> using namespace std; #include "CRectangle.h" #include"CPoint.h" CRectangle::CRectangle(char fillChar) { m_fillChar = fillChar; } CRectangle::CRectangle(CPoint bottomLeft, CPoint topRight, char fillChar) { m_fillChar = fillChar; if(topRight.getX() < bottomLeft.getX()){ topRight.setX(bottomLeft.getX()); } if(topRight.getY() < bottomLeft.getY()){ topRight.setY(bottomLeft.getY()); } } void CRectangle::setCorners(CPoint bottomLeft, CPoint topRight) { if(topRight.getX() > bottomLeft.getX()){ m_topRight = topRight; m_bottomLeft = bottomLeft; } if(topRight.getY() >bottomLeft.getY()){ m_bottomLeft = bottomLeft; m_topRight = topRight; } } CPoint CRectangle::getBottomLeftCorner()const { return m_bottomLeft; } CPoint CRectangle::getTopRightCorner() const { return m_topRight; } void CRectangle::setFillChar(char fillChar) { m_fillChar = fillChar; } char CRectangle::getFillChar() const { return m_fillChar; } bool CRectangle::operator ==(const CRectangle& other) const { return m_topRight == other.m_topRight && m_bottomLeft == other.m_bottomLeft &&m_fillChar == other.m_fillChar; } void CRectangle::draw(CScreen& screen) const { // Bitte implementieren } ostream& operator<< (ostream& lhs, const CRectangle& rhs){ lhs << "CRectangle[(" << rhs.getBottomLeftCorner().getX() << "," <<rhs.getTopRightCorner().getY() << ")"<< ","<< "("<<rhs.getTopRightCorner().getX()<< ","<< rhs.getTopRightCorner().getY()<<"),"<< rhs.getFillChar()<<"]" << endl; return lhs; }
#ifndef ASCIISCREENSOLUTION_MYCODE_CPOINT_H_ #define ASCIISCREENSOLUTION_MYCODE_CPOINT_H_ #include<iostream> using namespace std; /** * Diese Klasse repr‰sentiert einen Punkt ein einem Ganzzahl-Koordinatensystem. */ class CPoint { private: /** Die x-Koordinate (Spalte) */ int m_x; /** Die y-Koordinate (Zeile) */ int m_y; public: /** * Erzeugt ein neues Objekt mit den angegeben * Werten f¸r die x- und y-Koordinate. */ CPoint(int x = 0, int y = 0); /** * Setzt die x-Koordinate auf den angegebenen Wert. */ void setX(int x); /** * Setzt die y-Koordinate auf den angegebenen Wert. */ void setY(int y); /** * Liefert den Wert der x-Koordinate. */ int getX() const; /** * Liefert den Wert der y-Koordinate. */ int getY() const; /** * Pr¸ft, ob die x- und y-Koordinaten der Punkte ¸bereinstimmen. */ bool operator== (const CPoint& other) const; /** * Pr¸ft, ob sich die x- und y-Koordinaten der Punkte unterscheiden. */ bool operator!= (const CPoint& other) const; }; #endif /* ASCIISCREENSOLUTION_MYCODE_CPOINT_H_ */
#include<iostream> using namespace std; #include "CPoint.h" CPoint::CPoint(int x, int y) { m_x = x; m_y = y; } void CPoint::setX(int x) { m_x = x; } void CPoint::setY(int y) { m_y = y; } int CPoint::getX() const { return m_x; } int CPoint::getY() const { return m_y; } bool CPoint::operator ==(const CPoint& other) const { return m_x == other.m_x && m_y == other.m_y; } bool CPoint::operator !=(const CPoint& other) const { return m_x != other.m_x || m_y != other.m_y; }
#ifndef ASCIISCREENSOLUTION_MYCODE_CSCREEN_H_ #define ASCIISCREENSOLUTION_MYCODE_CSCREEN_H_ #include<iostream> using namespace std; #include "CPoint.h" #include "CRectangle.h" #include "CScreen.h" /** * Dies Klasse repr‰sentiert einen Bereich von 80x24 "Punkten", * die als ein beliebiges Zeichen dargestellt werden kˆnnen. */ class CScreen { private: /** Der Speicher f¸r die Darstellung der Punkte. */ char m_content[24*80]; public: /** * Erzeugt eine neue Darstellung, bei der alle Punkte * auf den Wert '.' gesetzt sind. */ CScreen(); /** * Setzt den angegebenen Punkt auf das angegebene Zeichen. */ void setPoint(CPoint point, char content); /** * Gibt die Darstellung aus. */ void print() const; /** * Lˆscht die Darstellung. Alle Zeichen werden wieder auf * '.' gesetzt. */ void clear(); }; #endif /* ASCIISCREENSOLUTION_MYCODE_CSCREEN_H_ */
#include <iostream> #include "CScreen.h" using namespace std; CScreen::CScreen() { clear(); } void CScreen::setPoint(CPoint point, char content) { if (point.getX() < 0 || point.getY() < 0 || point.getY() * 80 + point.getX() >= 24*80) { return; } m_content[point.getY() * 80 + point.getX()] = content; } void CScreen::print() const { cout << " "; for (int col = 0; col < 80; col++) { cout << col / 10; } cout << endl; cout << " "; for (int col = 0; col < 80; col++) { cout << col % 10; } cout << endl; for (int row = 23; row >= 0; row--) { if (row < 10) { cout << ' '; } cout << row << ": "; for (int col = 0; col < 80; col++) { cout << m_content[row * 80 + col]; } cout << endl; } cout << endl; } void CScreen::clear() { for (int i = 0; i < 24*80; i++) { m_content[i] = '.'; } }
Leute ich habe nach etlichen Stunden jetzt nur noch 2 Error?
Description Resource Path Location Type
make: *** [CScreen.o] Error 1 WS14 C/C++ Problem
unknown type name 'CScreen' CRectangle.h /WS14 line 104 C/C++ ProblemWarum der CSreen nicht erkennt ?
Ich bin kein Informatiker und bin überfordert ?
-
@Programmer33 rekursives include? (getippt)
Edit: und immer noch using... mittendrin...
-
Wo soll denn using raus ?
Unser Prof erklärt uns nichts .
Und beim lernen bin ich auf mich selber angewiesen .Drehe durch bei den vielen Codes ?
Welches rekursive ?
-
@Programmer33 using namespace ... niemals (niemals), also gar niemals vor einem include!
-
@Programmer33 egal ob Studium oder Ausbildung: Breymann der c++-Programmierer. Aktuell für c++17. Hoffe ich bekomme irgendwann provision
Da kannst dich bei sowas nicht auf das Unterrichtsmaterial verlassen. Man braucht extra was genaues zum nachschlagen...
-
@Programmer33 sagte in C++ Error:
Welches rekursive ?
#include "CScreen.h" // hier in dieser Datei "CScreen.h" soll // also die "CScreen.h" eingefügt werden?? /** * Dies Klasse repr‰sentiert einen Bereich von 80x24 "Punkten", * die als ein beliebiges Zeichen dargestellt werden kˆnnen. */ class CScreen { private:
Diese. Vorrausgesetzt dies ist ein Teil der Datei „CScreen.h“ was ich nur raten kann...
hth
Edit: include-guard hast du ja. Trotzdem unsinnig die Zeile...
-
oh man weiss auch nicht wie ich das gemacht habe .
Aus versehen wohl.
Aber auch nach beseitigen dieses Fehler : Immer noch errorWoran kann es liegen?
-
@Programmer33 ups, ich sehe gerade der Fehler war ja in der CRect...
-
habe auch die using namespace nach dem Include eingebaut ?
Iostream auch nach include ?
-
ja in der Rectangle wird hier gemeckert ?
Es erkennt das CScreen nicht ?void draw(CScreen& screen) const;
-
@Programmer33 Nehme erstmal in allen *.h das using komplett raus. Wenn es irgendwo gebraucht wird mach jeweils ein std:: vor...
Dann in allen *.cpp das using namespace unter dem letzten include. Oder nimm es auch raus und mach auch immer ein std:: vor (std::endl, std::cout etc)
-
und setze die Fehlermeldungen auch in code-tags...
-
das hat die fehler nur verdoppelt lol.
Mache sie jetzt wieder rein.
-
@Programmer33 Nein! Nochmal den Code mit Fehlermeldung in code-tags. Woher sollen wir wissen was gerade bei dir aktuell ist...
-
Description Resource Path Location Type make: *** [CScreen.o] Error 1 WS14 C/C++ Problem unknown type name 'CScreen' CRectangle.h /WS14 line 104 C/C++ Problem
Diese Zeile wird angezeigt :void draw(CScreen& screen) const;
Die ist auch nicht implementiert ?
Vielleicht liegt es daran lol
-
#include "CRectangle.h"
gehört nicht in CScreen.h. Wird nicht gebraucht.
-
@Programmer33 Bei mir funktioniert es nach den entsprechenden Änderungen. Alle usings in .h raus, using in .cpp unter den letzten include. vor ostream ein std:: und die CRectangle.h raus aus CScreen.h. Nur ein Warning wg. ungenutzeten Parameter. Die CPoint.cpp hab ich jetzt nicht probiert.