mit bool parametrisierte klasse;schreiben eines copy-konstruktors der ein objekt mit dem parameter=false annmimmt
-
habe eine klasse die ein bool als template-paremeter erhaelt (isconst). objekte dieser klasse haben einen zeiger der auf ein objekt von einer abstrakten klasse zeigt, die zwei abgeleitete klassen hat. alle drei sind innerhalb der aeusseren klasse definiert. sie verwenden ebenfalls isconst.
im copy-konstruktor erzeuge ich eine kopie des objekts auf das der zeiger zeigt. dafuer verwende ich eine clone-methode (weil ich ja mit einem zeiger auf die abstrakte basisklasse sonst keine kopie eines objekts der abgeleiteten klassen machen kann).
wenn ich nun aber ein objekt der klasse mit isconst = true erzeugen will indem ich den copy-konstruktor mit einem objekt der klasse mit isconst = false aufrufe erhalte ich durch den aufruf der clone-methode ja trotzdem ein objekt der internen klasse mit isconst = false.
wie kann ich das am besten loesen? ich dachte ich sollte vielleicht der internen klasse einen convertierungsoperator geben. waer das ne gute loesung? [wuerde das ueberhaupt funktionieren?] werd's jetzt mal ausprobieren.
mal eine kleine uebersicht:
aeussere<bool isconst> innere{virtual clone()=0} innere_a:innere{clone(){...}} innere_b:innere{clone(){...}} innere* zeiger aeussere(aeussere<false> a):zeiger(a.zeiger->clone()/*gibt objekt mit isconst=false zurueck, auch wenn ich grade ein objekt mit isconst=true erzeuge :(*/)//etc
-
hm, hab jetzt mal versucht auch noch eine const_cast methode zu schreiben. aber wenn ich dann im copy-konstruktor den zeiger initialisieren will klappt das nich. ich versuche folgendes:
Iterator(Iterator<false>& i):actualIterator(isconst?i.actualIterator->const_clone():i.actualIterator->clone()){}kriege dann folgenden fehler:
error C2446: ':': Keine Konvertierung von 'multimap<K,V>::Iterator<isconst>::ActualIterator *' in 'multimap<K,V>::Iterator<isconst>::ActualIterator *'(der eine zeiger ist mit isconst = false, der zweite mit isconst = true, sonst gleich)
liegt das daran dass der compiler nicht weiss dass der false-fall nicht auftreten kann, wenn isconst=true ist?
-
hab mir jetzt noch ne extre klasse geschrieben:
template<bool bla> struct converter { static typename Iterator<bla>::ActualIterator* convert(typename Iterator<false>::ActualIterator* q) { return q->clone(); } }; template<> struct converter<true> { static typename Iterator<true>::ActualIterator* convert(typename Iterator<false>::ActualIterator* q) { return q->const_clone(); } };ist das ne gute loesung?