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++ Problem

    Warum 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 error

    Woran 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.


Anmelden zum Antworten