Bitmap loader
-
Also der ZpBmpLoader class nen
ZpBmpLoader(const ZpBmpLoader *bmp)verpassen.
Wie soll der nun genau aussehen? Ähnlich wie der '=' operator?!
-
referenz auf ein objekt, kein zeiger.
-
Soll ich beim '=' operator auch lieber Referenzen verwenden?
-
class Foo { public: Foo(const Foo&); Foo& operator=(const Foo&); };erscheint mir sinnvoll.
referenz bietet sich der einfachheit der übergabe des objektes meiner meinung nach an. (sonst müsstest du ja immer die methode o.operator=( &deinobjekt) aufrufen)
-
Stimmt, dann muss man auch nicht mehr so viele Fehlerchecks in die Methoden implentieren.
Hast du noch ne Antwort auf das Release Problem?
-
ich frage mich grad, wozu du den kopierkonstruktor eigentlich brauchst.
ich seh nur instanzen in deiner klasse, keine verweise, und kein new im konstruktor..
-
Warum, es wird doch m_Imgage.ARGB erneuert.
Soll ich die ganze Klasse erneuern???
-
ein kopierkonstruktor (und ein selbsthergestellter zuweisungsoperator) und ein definierter destruktor sind dann nötig, wenn die klasse wirklich ein tiefe kopie braucht. das ist dann der fall, wenn das objekt über zeiger im konstruktor mit new ein objekt auf dem heap alloziert. da ein objekt für sich sorgen soll, muss es selber auch üblicherweise im destruktor dieses alloziierte stück wieder freigeben.
wenn du eine kopie erstellst, besteht bei der flachen kopie in diesem von mir beschriebenen obigen fall dann das problem, dass der zeiger auf das im konstruktor allozierte objekt kopiert wird, und damit zwei zeiger auf dasselbe objekt bestehen.
beim aufruf eines destruktors wird dann das objekt gelöscht, der zweite destruktoraufruf der kopie (zum beispiel) läßt das programm abstürzen, da nichts mehr auf dem heap reserviert ist.
es ist wie siamesische zwillinge mit einem herzen.du musst in diesem fall, also wenn eine klasse über einen zeiger extra nochmal alloziert, für eine tiefe kopie sorgen.
wenn du in einer methode (nicht konstruktor) allozierst, und den zeiger nicht irgendwie weitergibst, erzeugst du speicherlöcher.
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=BigThree#Answ
-
Ja, dass ist schon klar.
-
sorry, hab dein programm noch nicht ganz durchstiegen.
der vortrag war voreilig
-
Sind auch ne ganze menge Zeilen, auf jeden Fall will ich ne Image class erstellen (statt Membervariable), sodass ich auch TGAs, Gifs und Jpgs laden kann.
-
mach erstmal das
ZpBmpLoader::ZpBmpLoader(void) { m_Image.m_pARGB=NULL; }dein m_Image ist einfach nicht angesprungen.
aber mir ist das alles zu gefährlich, soll man ein könner draufschaun

-
Wozu soll das gut sein???
-
alleine bei falscheingabe einer datei stürzt dein programm sonst schon ab, bei aufruf von release..
bool ZpBmpLoader::LoadBmpFile(const char *pFileName) { FILE* pFile = fopen(pFileName, "rb"); if(!pFile) return(false);du fragst ja in release ab auf
if(m_Image.m_pARGB != NULL)aber wo wird der zeiger m_pARGB genullt? überseh ich das?
-
Stimmt, soloche Sachen übersieht man schnell!!!
-
und ebenso hier..
if((m_BmpFileHeader.m_cType[0] != 'B') && (m_BmpFileHeader.m_cType[1] != 'M')) return(false);