Konstruktor frage c++



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



  • Nee, ist immer noch Quatsch.
    Du bist doch Mathematiker. Das ist alles komplett logisch. Die Reihenfolge ist ganz wichtig. Und die ist wohl anders, als das in der Aufgabe angegeben ist. Aber was passieren muss, ist trotzdem straight forward. Du darfst erst das neue Element einfügen, nachdem du sichergestellt hast, dass du genügend Speicher hast. Dafür wurden dir zwei Bedingungen mitgegeben. Das musst du alles vorher auswerten, bevor du neuen Speicher reservierst und rumkopierst. Das für sich stehende if (arraySize < 100) ist daher völlig nutzlos, du reservierst den Speicher danach ja nicht mehr. Wie gesagt, die Reihenfolge ist ganz wichtig, und nicht, einfach nur alles, was in der Aufgabe steht, irgendwie in den Code zu schmeißen.



  • Ehrlich gesagt . Ich verstehe gar nicht warum das rum kopieren gemacht wird ?

    Für was soll ich das rumkopieren ?

    Die Bedingungen weiss ich :
    Einmal : Speicher voll (m_nextFree == m_arraySize) = doppelte Grösse.

    m_nextFree >100 -> arraySize+100

    Die Logik verstehe ich ja



  • Wenn der Speicher voll ist, musst du neuen Speicher anlegen. Da ist aber nichts drin. Also musst du die Objekte aus dem alten Speicher in den neuen rüberkopieren (aber nur so viele, wie im alten drin waren), und dann den alten freigeben.
    Normalerweise programmiert man das alles so nicht. Wie schon ganz am Anfang geschrieben, würde man eher einen std::vector benutzen, damit wär das alles viel einfacher sicherer. Aber einmal muss man das halt verstanden haben.



  • 
    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<(m_arraySize);i++){
      
    		newRectangle[i] = m_rectangles[i];
    		
        }
        delete[] m_rectangles;
        m_rectangles = newRectangle;
    
        m_arraySize = newSize;
        m_rectangles[m_nextFree] = rectangle;
            m_nextFree++;    
    }
         
    
    

    Das mache ich also wenn Speicher voll ist ?

    soll ich for schleife über arraysize gehen?



  • Fast...
    Die letzten beiden Zeilen solltest du aus dem if rausziehen, denn das willst du auf jeden Fall machen, auch wenn der Speicher schon von vornherein gereicht hat.
    Und jetzt fehlt noch das mit 100... Das musst du in die Berechnung von newSize einbeziehen.



  • Habe jetzt doch wieder Hoffnung geschöpft.
    Ist wie eine Achterbahnfahrt.

     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<(m_arraySize);i++){
    
    		newRectangle[i] = m_rectangles[i];
    
        }
        delete[] m_rectangles;
        m_rectangles = newRectangle;
    
        m_arraySize = newSize;
    
        if(m_arraySize < 100){
    
        	newSize = m_arraySize*2;
        }
    
        else{
        	    newSize = m_arraySize+100;
             }
        }
    
         m_rectangles[m_nextFree] = rectangle;
         m_nextFree++;
    
         }
    
    
    
    
    

    Das wars?



  • Was machst du beruflich Mechanics?



  • Ich bin Softwareentwickler, wenn man auch die Arbeit als Werkstudent mit dazuzählt, dann schon seit über 10 Jahren.

    Das mit dem newSize ist immer noch derselbe Quatsch. Ich weiß nicht, wie ich das sonst erklären soll.... Das if/else ist nicht schlecht. Aber das musst du machen, BEVOR du neuen Speicher anlegst und kopierst.


Anmelden zum Antworten