globale Funktion
-
Hallo,
ich würde gern eine Funktion umsetzen die folgendes realisiert:
es geht darum eine globale Funktion lochen() zu schreiben, welche die Parameter mp vom Typ Metallplatte sowie maxAnzahl und anzahlLoecher vom Typ int hat. Die Funktion erzeugt eine gelochte Platte (GPlatte) mit den gleichen Abmessungen wie mp und mit einer maximalen Zahl von maxAnzahl Löchern, stanzt anzahlLöcher in die Platte und gibt die gelochte Platte als Ergebnis zurück. Falls anzahlLöcher größer als maxAnzahl ist, wird eine Ausnahme vom Typ out_of_range ausgelöst.
Ich habs`s mal probiert. Allerdings hab ich wohl noch einiges falsch gemacht. Wäre nett wenn ihr euch das mal anschauen könntet und meinen Code verbessert.
GPlatte lochen(MetallPlatte mp, int maxAnzahl, int anzahlLoecher) { GPlatte* gp = new GPlatte(mp.getLaenge(), mp.getBreite(),maxAnzahl); for(int i=0; i<anzahlLoecher; i++) { gp->neuesLochStanzen(); } return (*gp); } int main() { MetallPlatte mp(20,10); GPlatte gp = lochen(mp, 10, 3);
-
Der Code riecht nach Speicherlecks! Du benutzt new ohne delete. Besser wäre:
GPlatte lochen(const MetallPlatte* mp, int maxAnzahl, int anzahlLoecher) { GPlatte gp(mp->getLaenge(), mp->getBreite(), maxAnzahl); for(int i = 0; i < anzahlLoecher; i++) gp.neuesLochStanzen(); return gp; } int main() { MetallPlatte mp(20,10); GPlatte gp = lochen(&mp, 10, 3);Zusätzlich habe ich den Parameter mp noch als Zeiger definiert. Damit wird nicht die gesamte Klasse bei der Parameterübergabe auf den Stack gepusht, sondern nur die Adresse.
Bei den anderen Sachen kann ich Dir auch nicht weiterhelfen. Du schreibst, dass etwas nicht geht. Worum handelt es sich denn?
Hackbert
-
Hallo,
ich hab da noch ne Frage (bin ein C++ Neuling). Du erzeugt das Objekt gp auf dem Stack. Ich hab's vorher auf dem Heap erzeugt. Wenn ich es so wie in Deinem Code auf dem Stack erzeuge dann wird es doch gelöscht sobald ich die Funktion verlasse? Kannst Du mir erklären warum das Objekt nach dem verlassen der Funktion lochen aber noch da ist?
GPlatte lochen(const MetallPlatte* mp, int maxAnzahl, int anzahlLoecher) { GPlatte gp(mp->getLaenge(), mp->getBreite(), maxAnzahl); for(int i = 0; i < anzahlLoecher; i++) gp.neuesLochStanzen(); return gp; } int main() { MetallPlatte mp(20,10); GPlatte gp = lochen(&mp, 10, 3);
-
Das kommt daher, weil es dann beim Rückgabewert kopiert wird.
GPlatte lochen(const MetallPlatte* mp, int maxAnzahl, int anzahlLoecher) //^^^^^ ist auch eine Variable auf dem Stack!Kann bei großen Objekten auch in die Hose gehen. Z.B. wenn du anstatt GPlatte einen vector mit eine Mio. Elementen drin hast. Werden diese auch mit kopiert.

Bei einfachen Datentypen (int, char, Pointer usw.) ist das kein Problem. Wenn GPlatte nur wenige Member-Attribute hat, ist das auch noch vertretbar. Aber ansonst kannst du auch einen Smart-Pointer zurück geben. Oder du machst folgendes, was dann aber keine Factory mehr ist (was aber dein obiges Beispiel ja ist):
void lochen(GPlatte &gplatte, int anzahlLoecher)Damit übergibst du eine erstellte GPlatte und lochst die dann halt nur noch.