Konstruktor frage c++



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



  • @zalo3 sagte in Konstruktor frage c++:

    	for(int i = 0; i<(m_arraySize*2);i++) {
    		newRectangle[i] = m_rectangles[i];
    	}
    

    Das kannst Du nicht tunfisch, weil der Speicherbereich auf den m_rectangles zeigt nur m_arraySize Elemente lang ist und Du somit mit m_rectangles[i] mit einem i größer gleich m_arraySize auf Speicher zugreifst, der Dir nicht gehört.

    @zalo3 sagte in Konstruktor frage c++:

    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?

    Entweder wie ich oben geschrieben habe

    std::size_t new_size{ m_arraySize < 100 ? m_arraySize * 2 : m_arraySize + 100 };
    

    oder

    std::size_t new_size;
    if( m_arraySize < 100 )
        new_size = m_arraySize * 2;
    else
        new_size = m_arraySize + 100;
    

    @zalo3 sagte in Konstruktor frage c++:

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

    Sorry, nix verstehen.

    @mechanics sagte in Konstruktor frage c++:

    das ganze ist noch nicht 100% exception safe.

    Aja, std::copy() kann werfen, wenn der copy-ctor wirft. Well ... shit happens.



  • Ich habe gerade ein kleines Problem ,was mir Schwierigkeiten macht die AUfgabe selbst zu lösen

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

    CRectangle* newRectangle = new CRectangle [ m_arraySize];

    Ich muss ja um ein neues array Speichergrösse festzulegen auch irgendwie so machen:
    CRectangle* newRectangle = new CRectangle [ m_newSize];
    Aber das m_newSize wird dann nicht erkannt ?

    Wie soll ich es vorher definieren ?Das habe ich bei Speicher anlegen noch nie gemacht?
    Da im Header bei unseren AUfgaben immer vorgegeben war ?
    Kann mir das jemand erklären bitte

    Ich will versuchen selbst auf die Lösung zu kommen .Wie swordfish gemacht hast verstehe ich zwar , aber ich will es auch gerne nochmal selber machen



  • @zalo3 sagte in Konstruktor frage c++:

    Ich muss ja um ein neues array Speichergrösse festzulegen auch irgendwie so machen:
    CRectangle* newRectangle = new CRectangle[m_newSize];
    Aber das m_newSize wird dann nicht erkannt?

    Dann wirst Du ein newSize wohl deklarieren und definieren müssen, bevor Du es verwendest.



  • ja habe es gerade gemacht. :smiling_face_with_open_mouth_closed_eyes:

    Ich glaube,dass ich an der Lösung nah dran bin .
    Melde mich in kürze.

    Ich nerve euch bis ich es geschafft habe😇



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

    Ich verstehe allerdings noch nicht gleich wo das eingebaut werden muss:
    if(m_arraySize < 100){
    m_newSize = m_arraySize*2;
    }
    else{
    m_newSize = m_arraySize+100;
    }

    Da ja der Speicher so nicht erkannt wird ?

    Jetzt langsam habe ich auch keine Idee mehr?



  • Würdest Du bitte deinen Code ordentlich einrücken und überflüssige Leerzeilen entfernen?

    Ach, ich machs selbst:

    @zalo3 sagte in Konstruktor frage c++:

    void CDrawing::add(const CRectangle& rectangle)
     {
     	if (m_nextFree == m_arraySize) {
     		int m_newSize = m_arraySize * 2; // 1)
     		CRectangle* newRectangle = new CRectangle[m_newSize];
    
     		for (int i = 0; i < (m_newSize); i++) {
     			newRectangle[i] = m_rectangles[i]; // 2)
     		}
    
     		delete[] m_rectangles;
     		m_rectangles = newRectangle;
     		m_arraySize = m_newSize;
     	}
     
     	m_rectangles[m_nextFree] = rectangle;
     	m_nextFree++;
     
     	if (m_arraySize < 100) { // 3)
     		m_newSize = m_arraySize * 2; // 4)
     	}
     	else {
     		m_newSize = m_arraySize + 100;
     	}
     }
    
    1. warum stellst Du einer lokalen Variable ein m_ voran ? Den Präfix verwendet man üblicherweise nur für Membervariablen um sie ohne this-> davor von etwaigen gleichnamigen Parametern unterscheiden zu können.

    2. Du greifst mit m_rectangles[i] noch immer (oder schon wieder) auf Speicher zu, der dir nicht gehört wenn i größer gleich m_arraySize wird.

    3. Ist hier fehl am Platz. Erstens soll das nur stattfinden wenn größerer Speicher besorgt werden muss und zweitens ist m_arraySize an dieser Stelle eventuell schon erhöht worden (int m_newSize = m_arraySize * 2; /* ... */ m_arraySize = m_newSize;)

    4. m_newSize existiert hier nicht mehr sondern nur im Scope des if oben, da es darin deklariert wurde.



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

    Soll ich den Speicher ausserhalb der if Bedingung schon erstellen?



  • So unbeholfen kann man doch nicht sein, oder?
    @Swordfish hat dir doch den Code schon gezeigt...

    @zalo3 sagte in Konstruktor frage c++:

    Wie swordfish gemacht hast verstehe ich zwar

    Das glaube ich dir daher nicht.



  • Keine Fehler

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

    Bin wie immer offen für Kritik?😄



  • Schön langsam komme ich mir verarscht vor. Du hast meine Anmerkungen zu Deinem Code nicht berücksichtigt sondern nur zwei Zeilen verschoben.

    Was passiert bei Deinem jetzigen Code mit dem mit new[] besorgten Speicher, wenn m_nextFree == m_arraySize nicht wahr ist?



  • Dann wird das hier gemacht:
    m_rectangles[m_nextFree] = rectangle;
    m_nextFree++;

    Aus meiner Sicht richtig ☹



  • Ich hatte vorher dein edit nicht gesehen swordfish.
    Langsam gebe ich auch fast schon auf:
    void CDrawing::add(const CRectangle& rectangle){

    if(m_nextFree == m_arraySize ){
    int newSize = m_arraySize2;
    CRectangle
    newRectangle = new CRectangle [ newSize];
    for(int i = 0; i<(newSize);i++){

    	newRectangle[i] = m_rectangles[i];  ??? Was soll ich hier dann machen?
    }
    

    Wie soll ich sonst die Einträge in das neue Array kopieren ?



  • @swordfish Ich meinte eigentlich, wenn copy wirft, dann wird new_mem nicht freigegeben.



  • Da ist ja wieder viel dazugekommen...
    Zalo3, was ist denn dein Background? Bist du Schüler, Student, studierst was anderes und wirst "gezwungen" in einer Vorlesung zu programmieren? Entweder machst du dich über uns alle lustig, oder du bist ziiiiemlich unbegabt 😉



  • Die scheiss Aufgabe treibt mich in den Wahnsinn.



  • studiere mathe nur ein Fach informatik.
    Und ich hasse es .



  • Du studierst Mathe? Ich bin schockiert 😃
    Nicht nur ein Fach 😉 Als Mathematiker wirst du fast ausschließlich programmieren müssen, oder wie stellst du dir das vor?



  • Ich habe den code noch ein wenig verbessert und es probiert .
    Ich poste es mal rein ,vielleicht hilft das jemand anderen teilweise weiter .

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

    Ich verstehe es einfach nicht .
    Ist halt so .


Anmelden zum Antworten