Konstruktor frage c++



  • Da ich weiss ,dass ihr ungern bei Übungsaufgaben hilft oder gerne Lösung vorzeigt .

    Möchte ich hier nur ein kleinen Teil des Codes präsentieren(um nicht unnötig Zeit zu verlieren) wo ich nicht sicher bin ob der Konstruktor passt, da sie auch ehrlich gesagt nicht viel darüber in der AUfgabe sagen:

    #ifndef CDRAWING_H_
    #define CDRAWING_H_
    #include "CPoint.h"
    #include "CScreen.h"
    #include "CRectangle.h"
    
    class CDrawing{
    private:
    	CRectangle* m_rectangles;
    	int m_nextFree = 0;
    	int m_arraySize;
    
    public:
    	CDrawing(int initialSize =10);
    	 ~CDrawing();
    	void add(const CRectangle& rectangle);
    	void print();
    	void drawFiltered( CScreen& screen, char filter = 0);
    
    
    
    };
    
    
    
    
    #endif /* CDRAWING_H_ */
     
    

    cpp

     
    #include<iostream>
    using namespace std;
    #include"CDrawing.h"
    
    CDrawing::CDrawing(int initialSize ){
    
    
    if(initialSize >10 || initialSize < 0){
    	initialSize = 10;
    
    
    }
    else {
    	m_arraySize = initialSize;
    	m_rectangles = new CRectangle [m_arraySize];
    
    }
    
    
    }
    
    CDrawing::~CDrawing(){
    	
    	delete [] m_rectangles;
    }
    
    
    
    

    Richtig?
    https://www.pic-upload.de/view-35663883/Bildschirmfoto2018-07-21um13.21.10.png.html



  • Nein.

    Von std:: vector habt ihr vermutlich nichts gehört.



  • nein wir behandeln nur Grundlagen .
    Kannst du mir auch sagen ,was falsch ist ?



  • @zalo3 sagte in Konstruktor frage c++:

    nein wir behandeln nur Grundlagen .

    std::vector ist Grundlage für die hier geforderten dynamischen Arrays. Den Speicher manuell zu verwalten wäre fortgeschrittener Stoff und die Aufgabe würde zeigen, wie man es nicht macht.

    Kannst du mir auch sagen ,was falsch ist ?

    Nein, es ist deine Hausaufgabe. Überlege dir, was dein Konstruktor macht, wenn du ihn mit verschiedenen Werten aufrufst. Stimmt das mit der Aufgabe überein? Wo steht das? Tipp: dein Programm stürzt für einige Werte ab.



  • es ist keine Hausaufgabe .
    Aber ok . Trotzdem danke .
    Ihr könnt den Thread wieder schliessen .



  • Das ist halt typisch schlechtes C++, wie das oft unterrichtet wird.
    Es ist nicht trivial, die Speicherverwaltung selber zu implementieren, und vor allem sinnlos, weil man das immer wieder in jeder Klasse tun würde. Oder man kapselt das Verhalten und bekommt eine neue Klasse. z.B. std::vector 😉
    Dein Konstruktor ist einfach falsch, überleg dir mal, warum da ein else brauchst und was konkret passiert.
    Was ist mit dem copy constructor, move constructor, copy assignment operator, move assignment operator? Rule of three bzw. five.



  • Das ist eine Alte Klausur und wir müssen halt nur Häppchen weise vorgehen was da steht .
    Copy Konstruktor ist in der Aufgabe nicht verlangt 😄

    Ich denke mal ,dass das mit arraySize falsch ist in der else Bedingung und die Zusicherung .
    Der Speicher kann auch grösser sein ,aber ich verstehe dann nicht was die von mir wollen ?

    Es steht ja nichts dabei ,was die Zusicherung machen soll?
    Blöde Aufgabe



  • Die Aufgabe ist so oder so blöd.
    Aber um das jetzt mal deutlich zu formulieren. Das else ist einfach falsch. Du willst auf jeden Fall den Speicher anlegen, dazu hast du das initialSize ja vorher angepasst, jetzt passt es auf jeden Fall und du reservierst du den Speicher.



  • bin schon wieder verwirrt .
    Irgendwie wenn ich Aufgaben im Forum poste bin ich verwirrter als vorher😂

     
    #include<iostream>
    using namespace std;
    #include"CDrawing.h"
    
    CDrawing::CDrawing(int initialSize, int arraySize ){
    m_arraySize = arraySize;
    
    if(m_arraySize < 0){
    
        initialSize = 10;
    	m_arraySize = initialSize;
    
    
    }
    else{
    
    	m_rectangles = new CRectangle [m_arraySize];
    }
    
    
    }
    
    CDrawing::~CDrawing(){
    
    	delete [] m_rectangles;
    }
    
    
    
    
    

    Ich hatte es jetzt so überarbeitet ?



  •  #include<iostream>
    using namespace std;
    #include"CDrawing.h"
    
    CDrawing::CDrawing(int initialSize, int arraySize ){
    m_arraySize = arraySize;
    
    if(m_arraySize < 0){
    
        initialSize = 10;
    	m_arraySize = initialSize;
    
    
    }
    
    
    	m_rectangles = new CRectangle [m_arraySize];
    
    
    
    }
    
    CDrawing::~CDrawing(){
    
    	delete [] m_rectangles;
    }
    
    
    
    

    So war es gemeint sorry



  • Ah, jetzt hast du gerade was neues gepostet...



  •  #include<iostream>
    using namespace std;
    #include"CDrawing.h"
    
    CDrawing::CDrawing(int initialSize, int arraySize ){
    m_arraySize = arraySize;
    
    if(m_arraySize < 1){
    
        initialSize = 10;
    	m_arraySize = initialSize;
    
    
    }
    
    
    	m_rectangles = new CRectangle [m_arraySize];
    
    
    
    }
    
    CDrawing::~CDrawing(){
    
    	delete [] m_rectangles;
    }
    
    
    
    
    
    
    

    Jetzt besser ?



  • Laut Aufgabenstellung hat der Konstruktor nur einen Parameter.



  • Ja ich weiss . Aber ich wusste nicht wie ich es sonst lösen soll?

    Habe die Logik nicht verstanden ?
    Und hier im Forum kam auch nicht gerade eine Idee ,da ihr ja nicht bei Aufgaben hilft



  • initialSize wird m_arraySize zugewiesen, ganz am Anfang.



  •  #include<iostream>
    using namespace std;
    #include"CDrawing.h"
    
    CDrawing::CDrawing(int initialSize){
    
    	m_arraySize = initialSize;
    
    
    if(m_arraySize < 1){
    
        m_arraySize = 10;
    
    
    }
    
    
    	m_rectangles = new CRectangle [m_arraySize];
    
    
    
    }
    
    CDrawing::~CDrawing(){
    
    	delete [] m_rectangles;
    }
    
    
    
    
    

    Schwere Geburt.

    So ok leute jetzt?



  • Würd sagen, das passt. Aber was machen die ganzen Leerzeilen da?



  • Ja die Leerzeilen mache ich weg.
    Endlich kann ich mit dem nächsten Aufgabenteil weiter machen .

    Bin positiv überrascht worden ,dass zum ersten mal jemand bei einer AUfgabe geholfen hat.
    In diesem Forum ist das eigentlich sehr unüblich.



  • Das kommt auf die Aufgabe/Fehler drauf an (das hier war echt trivial, sonst wärs auch eine gewisse Hürde, sowas langweiliges zu lesen/zu schreiben) und darauf, inwiefern die Frage/Kommentare zu trollen einladen.



  • Vielleicht fängt das mit dem Trollen jetzt an:face_with_stuck-out_tongue_closed_eyes: 😄

    Implementieren Sie die add Methode. Das als Parameter übergebene Rechteck soll dabei an die nächste freie Position des Array geschrieben werden. Falls kein freier Speicherplatz im Array mehr vorhanden ist, soll das Array auf die doppelte Größe vergrößert werden sofern es weniger als 100 Elemente enthält. Enthält es 100 oder mehr Elemente, wird es (wenn zusätzlicher Platz gebraucht wird) nur noch um 100 weitere Elemente vergrößert.

     
    void CDrawing::add(const CRectangle& rectangle){
    	m_rectangles[m_nextFree] = rectangle;
    	
    	if(m_arraySize < 100){
    		m_rectangles[2*m_arraySize] = rectangle;
    		
    		
    		
    	}
    	
    	if(m_arraySize >=100 && m_arraySize ==0){
    		m_rectangles[m_arraySize+100] = rectangle;
    		m_arraySize++;
    		
    	}
    
    
    

    Was sagt ihr dazu ?

    Aus meiner Sicht richtig?