PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Objekt kopieren (nur "abstrakte" Referenz verfügbar)


Nasenbaer
2010-11-04, 14:51:21
Hi,
ich bin gerade mit dem Refactoring eines alten Raytracers von mir beschäftigt und habe jetzt folgendes Problem:
Ich habe eine Funktion setBla(const CAbstract& val), die das übergebene Objekt kopieren und dann in CAbstract *_value speichern soll.



class CAbstract
{
// ...
}

class CDerived : public CAbstract
{
// ...
}

// ...

void setBla(const CAbstract& val)
{
// Mögliche Wege
_value = &val; // erstellt keine Kopie - klar! :)
_value = new CAbstract(&val); // Abstrakte klassen lassen sich nicht intanziieren.
_value = val.clone(); // Überladene Funkton erzeugt Kopie und liefert Pointer. Möglich aber gefällt mir nicht.
}

// ...
int main()
{
CDerived test(...);

setBla(test);
}


Ich würde das halt gerne irgendwie über den Copy-Constructor von CAbstract laufen lassen aber wüsste adhoc nicht wie das gehen soll. Gibt es für sowas vielleicht ein tolles Design Patern?


Hintergrund:
Mir gehts im Prinzip darum, dass Werte, die man von extern für ein Objekt setzt, dem Objekt nicht von außen auch wieder unterm Hintern weggerissen werden kann und das Objekt somit auf nen Nullpointer zugreift.

Nighthawk13
2010-11-04, 16:17:37
Direkte Lösung fällt mir nicht ein, aber evtl. lösen shared pointers das Problem auch ohne Kopie?

Nasenbaer
2010-11-04, 16:22:41
Direkte Lösung fällt mir nicht ein, aber evtl. lösen shared pointers das Problem auch ohne Kopie?
Meist sicher das aus Boost? Hab mich bisher noch so gut wie gar nicht mit der Boost-Lib beschäftigt und würde sowas höchstens mal in nem Rework machen.

Nighthawk13
2010-11-04, 17:00:22
Meist sicher das aus Boost? Hab mich bisher noch so gut wie gar nicht mit der Boost-Lib beschäftigt und würde sowas höchstens mal in nem Rework machen.
Yup, boost::shared_ptr.

Vielleicht geht das Kopieren auch mit boost::any, aber ich glaube dort braucht es eben die clone()-Funktion.

Neomi
2010-11-04, 17:40:31
Warum auch immer dir die Lösung nicht gefällt (warum eigentlich nicht?), beim Kopieren von Objekten, von denen die konkrete Klasse nicht bekannt ist, kommst du um die ein oder andere Form von Clone() kaum herum.

Nasenbaer
2010-11-04, 17:51:22
Warum auch immer dir die Lösung nicht gefällt (warum eigentlich nicht?), beim Kopieren von Objekten, von denen die konkrete Klasse nicht bekannt ist, kommst du um die ein oder andere Form von Clone() kaum herum.
Weil es dann wieder eine public-Funktion gibt, die man fast nie benötigt. Wäre halt schöner das "verstecken" zu können.

Hmm aber dann werd' ich die Sache wohl erstmal per clone() lösen und mir bei Gelegenheit endlich mal Boost genauer anschauen - da sollen ja so einige "Timesaver" drin sein. :)

ScottManDeath
2010-11-06, 11:44:56
Clone kann man mittels dem Kopier konstructor implementieren, welcher die Basisklassenkonstructoren aufruft. Die Clone Methode kann man dann auch als Template mixin implementieren, so dasd man das nur einmal schreibt und nie wieder :)