Konstruktor frage c++



  • @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;
    }
    


  • Um den Fragesteller noch etwas zu verwirren: das ganze ist noch nicht 100% exception safe.



  • Naja das Problem das wir sachen wie size_t usw nicht benutzen .

    Gibt es einen anderen Weg ?



  • Ich versteh dich nicht... Einerseits tust du was und machst auf mich nicht den Eindruck, als hättest du gar keinen Bock. Aber andererseits stellst du dich schon echt seltsam an.



  • Die Lösung von swordfish ist natürlich gut .
    Aber wir haben diese Sachen ja gar nicht behandelt.
    😄



  • Verstehst du den Code? Wenn size_t das einzige ist, was dich stört, dann nimm halt int, wie bisher. Das mein ich damit, dass du dich seltsam anstellst. Das ist jetzt doch echt kaum noch der Rede Wert.
    Und wegen dem copy steht sogar im Kommentar, dass man alternativ auch eine Schleife nehmen könnte.



  • @mechanics sagte in Konstruktor frage c++:

    das ganze ist noch nicht 100% exception safe.

    Wenn new[] wirft ist das Objekt doch im selben Zustand wie zuvor? Oder was genau meinst Du?



  • Ich habe es ein wenig nochmal über einen anderen Weg probiert😂

    Aber verpeile plötzlich ,da ich merke ,dass ich ja jetzt irgendwie den Scheiss mit den 100 Elementen noch einbauen muss.
    Drehe durch.

    Soll ich dafür jetzt noch ne If Bedingung MACHEN wieder ?
    Das kopieren von dem alten Array ins neue habe ich ja jetzt.

    tut mir leid für die Ausdrucksweise . Hab keine Nerven mehr

     void CDrawing::add(const CRectangle& rectangle){
    
    
    
    
    if(m_nextFree == m_arraySize ){
    
    
    	CRectangle* newRectangle = new CRectangle [ m_arraySize*2];
    
    	for(int i = 0; i<(m_arraySize*2);i++){
    
    		newRectangle[i] = m_rectangles[i];
    
    	}
    	delete[] m_rectangles;
    	m_rectangles = newRectangle;
    	m_arraySize = (m_arraySize*2);
    
    }
    m_rectangles[m_nextFree] = rectangle;
    m_nextFree++;
    
    
    }
    
    
    

    Was ist das genau mit den kleiner 100 Elementen genau ?
    Speicher voll oder Speicher noch da? Ich denke Speicher da?
    Dann wäre ja mein vergrössern des Arrays falsch?😭


Anmelden zum Antworten