Konstruktor



  • https://www.pic-upload.de/view-34084113/g.png.html

    Ist mein Konstruktor richtig implementiert?

    #include "CDrawing.h"
    
    CDrawing::CDrawing(int initialSize)
    {
        if(initialSize>0 && initialSize <=0){
    
            m_initialSize = initialSize;
        }
        else{
            m_initialSize = 10;
        }
        if(m_nextFree>=0 && m_nextFree<=m_arraySize){
    
            m_nextFree= nextFree;
        }
        else{
    
            m_nextFree=0;
        }
        if(m_arraySize>0){
            m_arraySize= arraySize;
        }
    }
    
    CDrawing::~CDrawing()
    {
        //dtor
    }
    
    #ifndef CDRAWING_H
    #define CDRAWING_H
    
    class CDrawing
    {
    private:
        CRectangle* m_rectangles;
        int m_nextFree = 0;
        int m_arraySize;
    
    public:
        CDrawing(int initialSize = 10);
        void ~CDrawing();
        void add(const CRectangle& rectangle);
        void print();
        void drawFiltered(CScreen& screen, char filter =0);
    
    };
    
    #endif // CDRAWING_H
    

    Ich weiss das das iostream usw fehlt ,aber stimmt der code soweit?



  • if(initialSize>0 && initialSize <=0)
    

    Komische Methode um nie zu schreiben.



  • Welcher Dummkopf von Lehrer kennt da schon wieder keinen std::vector?



  • Wir behandeln nur Grundlagen der Informatik.

    Passt aber so mein Konstruktor mit den Zusicherungen ?



  • Ich meine natürlich <=10

    Dann wäre es ok ?



  • xxx6 schrieb:

    Wir behandeln nur Grundlagen der Informatik.

    std::vector ist Grundlage.

    Passt aber so mein Konstruktor mit den Zusicherungen ?

    Nein



  • if(m_nextFree>=0 && m_nextFree<=m_arraySize
    

    Und was meinst du "eigentlich" da?



  • if(m_nextFree>=0 && m_nextFree<=m_arraySize
    

    Das stand ja in etwa so in der Zusicherung ?

    Ich könnte es auch so machen wie in der Zusicherung exakt:

    if( 0<= m_nextFree <= m_arraySize)
    

    In Ordnung?



  • Nein.Welchen Wert hat m_nextFree an der Stelle? Und m_arraySize?



  • der default Wert von m_nextFree = 0.

    Ich weiss nicht wie gross m_arraySize ist.
    Wo steht das ?



  • xxx6 schrieb:

    Ich weiss nicht wie gross m_arraySize ist.
    Wo steht das ?

    Genau die Frage stellt sich der Compiler auch.



  • Ja aber die Header war ja mir so gegeben ?

    Soll ich auch arraySize =10 setzen ?

    In der Aufgabe ist es ja nicht definiert .



  • Was setzt du denn noch auf 10? Steht das im Header? Warum 10? Welche Bedeutung haben die Werte und Variablen? Was ist eigentlich mit m_rectangles? Welchen Zustand soll das erzeugte Objekt haben, nachdem der Konstruktor ausgeführt wurde?



  • EHrlich gesagt weiss ich es auch nicht.
    Ich weiss auch nur die Sachen, die in der Aufgabenstellung stehen 😃



  • Tja, dann hast du wohl ein Problem...



  • Das ist meine CRectangle.h

    /*
     * CRectangle.h
     *
     *  Created on: 05.01.2015
     *      Author: mnl
     */
    
    #ifndef ASCIISCREENSOLUTION_MYCODE_CRECTANGLE_H_
    #define ASCIISCREENSOLUTION_MYCODE_CRECTANGLE_H_
    
    #include <ostream>
    using namespace std;
    
    #include "CPoint.h"
    #include "CScreen.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:
    	/** Die linke untere Ecke. */
    	CPoint m_bottomLeft;
    	/** Die rechte obere Ecke. */
    	CPoint m_topRight;
    	/** Das Füllzeichen für die graphische Darstellung. */
    	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ößer 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ößer 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);
    };
    
    #endif /* ASCIISCREENSOLUTION_MYCODE_CRECTANGLE_H_ */
    

    implemetierte cpp

    /*
     * CRectangle.cpp
     *
     *  Created on: 05.02.2015
     *      Author: lipp
     */
    
    #include "CRectangle.h"
    #include "CPoint.h"
    CRectangle::CRectangle(char fillChar)
    
    {
      m_fillChar = 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��er 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��er als
         * die y-Koordinate der linken unteren Ecke ist, wird sie auf
         * dem Wert der y-Koordinate der linken unteren Ecke gesetzt.
         */
    
    }
    
    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());
    	  }
    }
    
    void CRectangle::setCorners(CPoint bottomLeft, CPoint topRight)
    {
    	if(topRight.getX()> bottomLeft.getX() && topRight.getY()> bottomLeft.getY()){
    
    		m_bottomLeft = bottomLeft;
    		m_topRight = topRight;
    	}
    }
    
    CPoint CRectangle::getBottomLeftCorner() const
    {
    	// Bitte implementieren und dabei das return-Statement ersetzen.
    	return m_bottomLeft;
    }
    
    CPoint CRectangle::getTopRightCorner() const
    {
    	// Bitte implementieren und dabei das return-Statement ersetzen.
    	return m_topRight;
    }
    
    void CRectangle::setFillChar(char fillChar)
    {
    	// Bitte implementieren
    	m_fillChar = fillChar;
    }
    
    char CRectangle::getFillChar() const
    {
    	// Bitte implementieren und dabei das return-Statement ersetzen.
    	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
    {
        for(int j = m_bottomLeft.getX(); m_topRight.getX()>=j;j++){
    
    	for(int i = m_bottomLeft.getY();  m_topRight.getY()>=i; i++) {
    	    screen.setPoint(CPoint(j , i),m_fillChar);
    
    	}
        }
    }
    ostream& operator<< (ostream& lhs, const CRectangle& rhs){
    	lhs << "CRectangle[(" << rhs.getBottomLeftCorner().getX() << "," << " " << rhs.getBottomLeftCorner().getY() << ")" << "," << "(" << rhs.getTopRightCorner().getX() << " , "<< rhs.getTopRightCorner().getY()<< " )"<< ","<< " fillChar";
    
    return lhs;
    

    Hilft das weiter ?

    Ich dachte aber das der Konstruktor mit diesem Aufgabenteil nichts zu tun hatte?



  • Hilft das weiter ?

    Es würde dir weiterhelfen, wenn du über die Fragen nachdenkst. Ich werde deine Aufgabe nicht lösen.



  • xxx6 schrieb:

    EHrlich gesagt weiss ich es auch nicht.
    Ich weiss auch nur die Sachen, die in der Aufgabenstellung stehen 😃

    Was könnte den wohl mit ArraySize gemeint sein...



  • Die grösse eines Arrays [n+1];

    Oder halt 10?



  • xxx6 schrieb:

    Die grösse eines Arrays [n+1];

    Was soll das +1?