Konstruktor frage c++



  • 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?



  • @zalo3 sagte in Konstruktor frage c++:

    m_rectangles[2*m_arraySize] = rectangle;
    

    Das vergrößert nicht den Speicher, auf den m_rectangles zeigt, sondern greift bloß auf Speicher zu, der Dir nicht gehört.



  • Irgendwie hast du anscheinend noch nicht die richtige Denkweise fürs Programmieren... Ist ein ähnliches logisches Problem wie mit der ersten Aufgabe.
    Was machst du in deinem Code als erstes? Und WARUM machst du das, was du danach machst? Und wie stellst du dir vor, dass es funktioniert?
    Und warum probierst du das nicht eigentlich aus?
    Edit: das WARUM bezog sich auf das, was du eigentlich machen solltest, nicht auf den Quatsch, den du tatsächlich machst 😉



  • @swordfish sagte in Konstruktor frage c++:

    Das vergrößert nicht den Speicher, auf den m_rectangles zeigt, sondern greift bloß auf Speicher zu, der Dir nicht gehört.

    Soll ich in der Funktion neuen Speicher anlegen und dann vergrössern?



  • Einen mit new[] besorgen Speicherbereich kann man nachträglich nicht in seiner Größe verändern.

    Wenn m_nextFree == m_arraySize neuen Speicher der von der Aufgabenstellung geforderten Größe besorgen, alle Elemente 0 ... m_arraySize - 1 in den neuen Speicherbereich kopieren, den "alten" Speicher auf den m_rectangles zeigt entsorgen (delete[]), m_rectangles auf den "neuen" Speicherbereich zeigen lassen, m_arraySize auf den neuen Wert setzen.
    Das übergebene rectangle an m_rectangles[m_nextFree] schreiben und m_nextFree inkrementieren.



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

    Kann ich meine Bedingungen mit >100 usw lassen ?
    Oder einfach sagen wenn Speicher voll ist ?ALso m_nextFree == m_arraySize ?



  •  void CDrawing::add(const CRectangle& rectangle){
    	
    	
    	if(m_nextFree < m_arraySize ){
    	m_rectangles[m_nextFree] = rectangle;
    	
    	}
    	
    	if(m_arraySize < 100){
    		CRectangle* newRectangle = new CRectangle [m_arraySize -1];
    		delete[] m_rectangles;
    		newRectangle[2*m_nextFree] = rectangle;
    		
    		
    		
    	}
    	
    	if(m_arraySize >=100 && m_arraySize ==0){
    		newRectangle[m_nextFree+100] = rectangle;
    		m_nextFree++;
    		
    	}
    
    
    }```
    
    War fehler noch .
    Besser ?

Anmelden zum Antworten