Konstruktor frage c++



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


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


Anmelden zum Antworten