Konstruktor frage c++



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


  • @zalo3 sagte in Konstruktor frage c++:

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

    }

    }```



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


  • Evtl. besser, aber noch nicht gut. Aber wenn dich das motiviert, ja, besser 😉



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

    Habe die if Bedingung nochmal mit m_nextFree korrigiert .
    Jetzt müsste es ja passen.

    Mann kann hier nicht editieren



  • @zalo3 Hinter dem 3-Punkte-Menü rechts unter Deinen Beiträgen verbirgt sicht der Menüpunkt "Bearbeiten" ... wäre besser Deine Posts zu korrigiere, solange noch niemand geantwortet hat, statt ständig neu zu posten mit Miniänderungen.



  • Ich weiß nicht, ob dir das hilft, aber Programmieren ist komplett logisch. Es passiert genau das, was dransteht.
    Also versuch mal, dein Programm im Kopf Zeile für Zeile durchzugehen und überleg dir, was passiert, und ob du das willst.



  • @zalo3 sagte in Konstruktor frage c++:

    // ...
    

    Ich hab' Dir doch oben ganz genau beschrieben, wie es geht??

    Vorweg: CDrawing::m_nextFree und CDrawing::m_arraySize sollten wie alle Speichergrößen vom Typ std::size_t sein.

    #include <algorithm> // für std::copy(), alternativ eine Schleife zum kopieren verwenden.
    
    // ...
    
    void CDrawing::add(const CRectangle& rectangle)
    {
    	if(m_nextFree == m_arraySize) { // Wenn m_nextFree == m_arraySize
    		// neuen Speicher der von der Aufgabenstellung geforderten Größe besorgen:
    		std::size_t new_size{ m_arraySize < 100 ? m_arraySize * 2 : m_arraySize + 100 };
    		CRectangle * new_mem{ new CRectangle[new_size] };
    
    		// alle Elemente 0 ... m_arraySize - 1 in den neuen Speicherbereich kopieren:
    		std::copy(m_rectangles, m_rectangles + m_arraySize, new_mem);
    
    		// den "alten" Speicher auf den m_rectangles zeigt entsorgen:
    		delete[] m_rectangles;
    
    		// m_rectangles auf den "neuen" Speicherbereich zeigen lassen:
    		m_rectangles = new_mem;
    
    		// m_arraySize auf den neuen Wert setzen:
    		m_arraySize = new_size;
    	}
    
    	// Das übergebene rectangle an m_rectangles[m_nextFree] schreiben:
    	m_rectangles[m_nextFree] = rectangle;
    
    	// und m_nextFree inkrementieren:
    	++m_nextFree;
    }
    

Anmelden zum Antworten