Konstruktor
-
Mit Grösse wäre es ja so:
CRectangle* m_rectangles = new CRectangle[10];
Wir haben nur eine einführung in Programmierung ,daher kein Vector behandelt.
Wieso soll man beim Speicher allokieren noch die Grösse dazu schreiben ?
Das stand z.B in Büchern nicht drinnen .Woher soll ich das wissen?
-
So, warum nicht
m_arraySize = initialSize;
Wenn du new keine größe mit gibst, reservierst du Speicher für ein Element. Dass ist nicht was du willst. Steht sehr sicher in jedem c++ Buch. Sonst in der Dokumentation.
Außerdem gehört zu new ein delete, kein delete[].
delete[] gehört zu new []Was du wahrscheinlich haben wolltest ist sowas:
m_rectangles = new CRectangle[m_arraySize] ;
-
Wie sieht es eigentlich mit meinem Konstruktor aus Leute ?
Ich meine in der Aufgabe ist ja kaum gesagt worden was die überhaupt wollen ?
-
Es ist offensichtlich was gefordert ist.
-
Oder anders gesagt, dein Konstruktor entspricht nicht den Anforderungen.
-
Was fehlt genau an meinem Konstruktor ?
Es ist nur ne Ünungsaufgabeb
-
Der ist einfach nur falsch. Sinn des Konstruktors ist es anhand der übergebenen Parameter die Klassenmember korrekt zu initialisieren.
Also bei deinem Code aus initialSize die beiden Member m_rectangles und m_arraySize zu setzen (m_nextFree ist ja schon über die Klassendeklaration im Header auf 0 gesetzt).Die (erste) Lösung sieht also so aus:
CDrawing::CDrawing(int initialSize) { m_arraySize = initialSize; m_rectangles = new CRectangle[initialSize]; }
Für die Initialisierung gibt es aber explizit noch die Initialisierungsliste bei den Konstruktoren, so daß die Lösung dann so lautet:
CDrawing::CDrawing(int initialSize) : m_arraySize(initialSize), m_rectangles(new CRectangle[initialSize]) { }
In gutem (professionellen) C++ Code würde man aber dann stattdessen std::vector<> benutzen.
Und auf die ungarische Notation ("C" am Anfang des Klassennamens) solltest du auch zukünftig verzichten.
PS: Die Schreibweise
CDrawing(int initialSize = 10);
im Header bedeutet nur, daß 10 der Vorgabewert (default value) ist, wenn man beim Aufruf keinen Parameter angibt, also
CDrawing drawing;
So wird der Konstruktor mit 10 als initialSize aufgerufen (innerhalb des Konstruktorcodes kann dir das aber egal sein und muß nicht explizit darauf geprüft werden).
-
-
Kann mir jemand paar tipps geben wie ich bei der Aufgabe d) vorgehen soll?
Ich habe nicht mal ne idee wie ich rangehen soll,aber irgendwie muss ich es ja lernen
-
Gast83 schrieb:
http://www.informatikerboard.de/board/thread.php?postid=15665#post15665
Ja, das passiert, wenn man auf solche schlechten Fragestellungen eingeht.
-
Ja aber in dem Board gibt es leider nur freche Antworten leider
-
void add(const CRectangle& rectangle){ for(int i =0 ; i>= rectangle ;i++){ m_rectangles = new CRectangle[rectangle+i]; nächste freie Position geschrieben ? }
Passt so in etwa der Anfang der add Methode?
-
Was sagt denn dein Compiler dazu? Du musst deinen Code schon ausprobieren...
-
Fehler : m_rectangles not declared in this scope
Aber wie ich es weg bekomme ,keine Ahnung.
-
Du hast add als freie Funktion implemtiert und nicht als Klassenfunktion. Klassenfunktion haben die Form
Klassennamen::Funktionnamen(Parameter)
-
xxx6 schrieb:
Passt so in etwa der Anfang der add Methode?
Jaja
-
void CDrawing::add(const CRectangle& rectangle){ for(int i =0 ; i>= rectangle ;i++){ m_rectangles = new CRectangle[rectangle+i]; nächste freie Position geschrieben ? } if(m_rectangles <= CRectangle[rectangles+99]){ m_rectangles = new CRectangle[rectangles+rectangles]; verdoppelt? } }
Aus meiner Sicht sollte das verdoppeln dann auch passen?
Wenn manni sich nicht über mich lustig gemacht hat
-
Bei Kommentaren wird ein "//" voran gestellt.
Da passt die Frage, ob Du überhaupt versuchst Dein Code zu kompilieren?
-
Und, was soll der <= Vergleich mit rectangle? Was willst du damit ausdrücken?
-
void CDrawing::add(const CRectangle& rectangle){ for(int i =0 ; i<= rectangle ;i++){ m_rectangles = new CRectangle[rectangle+i]; nächste freie Position geschrieben ? } m_rectangles = new CRectangle[rectangle]; CRectangle[rectangle] =100; int *tmp = CRectangle; if(CRectangle[rectangle]<=CRectangle[100]){ wenn der Speich kleiner 100 ist m_rectangles = new CRectangle[rectangle*2]; doppelte Grösse for(int i =0 ; i<= rectangle ;i++){ CRectangle[rectangle]= tmp[rectangle]; } delete[] tmp; CRectangle[rectangle]; rectangle++; } }
Ich weiss nicht ob dieser Ansatz auch katastrophe ist aber ich poste ihn mal.
Ich habe nochmal neu angefangenStimmt dieser Teil ein wenig ?
Ich habe auch eine temporäre Variable erstellt.