Factory in C++
-
Hallo!
Ich brauche Polymorphimus zur Laufzeit, wo verschiedene Bildrepräsentationen vorliegen können, z.B. Rastergraphiken oder Vektorgraphiken.
Zur Bildverarbeitung brauche ich nun aber nur ein paar wenige Funktionen, denen es egal ist, ob das zu bearbeitende Bild nun von einem BMP, einem JPEG, einer Vektorgraphik oder was auch immer abstammt.
Gut, also packe ich diese paar allgemeinen Funktionen in ein Interface, nennen wir es IImage.Im Programm kann ich mir nun auch neue Instanzen von einer konkreten Klasse machen lassen mit einer Factory Funktion, der ich einen enum Wert übergebe.
Also sowas in der Art:
IImage* image=CreateImage(EBitmap);Jetzt kommt es bei manchen der Bildverarbeitungsalgorithmen vor, dass ich eine Kopie des Bildes brauche.
Das ganze läuft so nach dem Prinzipvoid doSomething(IIMage* img), das heißt ich übergebe das Bild und dieses wird bearbeitet, es wird also nicht ein neues Bild zurückgegeben, sondern das übergebene Bild wird bearbeitet und ist nach dem Funktionsaufruf geändert.
Zum Beispiel möchte ich das Bild um den Faktor 2 vergrößern. Dazu brauche ich ein neues doppelt so großes Bild, in welches ich dann reinzeichne. Bin ich mit dem zeichnen fertig, so swappe ich altes und neues Bild.So, nun zu meinem Problem: Wie löst man das kopieren im Algorithmus einigermaßen elegant?
IIMage* newImg=CreateImage(img->GetType()); doSomeThingWithNewImg(newImg,img); swap(img,NewImg); delete newImg;Ziemlich viel new/delete im Code, nicht schön. Aber mit Templates bekomm ich wiederum keinen Laufzeitpolymorphimus bzw. Factoy Funktionen zusammen.
Vorschläge?
-
class Image{ private: IImage* rep; ... Image(Image const& theOther){ rep=theOther->rep->clone();//clone ist dort virtual } ~Iamge(){ delete rep;//~IImage pur virtuell } int getWidth() const{ return rep->getWidth(); }und nur noch Image anfassen. Meistens Image& oder Image const&.
Also im Prinzip ein Smart-Pointer mit ein wenig Image-Zucker.
-
dankeschön

-
Noch was...wie bekomm ich jetzt da von der Factory Funktion was in die Image Klasse rein?
Die Factory liefert ja nur Pointer: IIMage* CreateImage(EImageType type);
Oder soll ich die Factory mit der Image Klasse verschmelzen, also Image::Image(EImageType type) machen, dann bekomm ich nie einen IImage Pointer zu sehen.
-
fdsfsdf schrieb:
Noch was...wie bekomm ich jetzt da von der Factory Funktion was in die Image Klasse rein?
Die Factory liefert ja nur Pointer: IIMage* CreateImage(EImageType type);
Oder soll ich die Factory mit der Image Klasse verschmelzen, also Image::Image(EImageType type) machen, dann bekomm ich nie einen IImage Pointer zu sehen.Na, klar!
-
gut dass das geklärt ist, dann kann ich ja jetzt weiterprogrammieren.
danke nochmal!
-
fdsfsdf schrieb:
void doSomething(IIMage* img)
Pointer: IIMage*
IImage PointerDeine "i"-Taste klemmt?