Allokator und Ctors
-
Hallo
Ich habe eine Template Allokator Klasse mit integriertem Stack, welche bis dato recht gut funktioniert - jedoch nur mit dem Standardkonsturktor.
Woher sollen denn auch die jeweiligen Parameter bekannt sein....
Gibt es da Tricks, boost-magie oder Makros die einem die Standardkonstruktoren der BASISKLASSE bereit stellen? Oder wie wird sowas gemacht....

Vielleicht geht da auch eine kleine (abstrakte) Unterklasse, dessen Basis dem Allokator übergeben wird und die Parameter zwischenspeichert oder etwas in der Art?template<class BASE, class DERIVED, int SIZE> BASE* allocator_t<BASE, DERIVED, SIZE>::alloc() { //Zensierte stack sachen ... DERIVED* ptr = (DERIVED*)(operator new(sizeof(DERIVED)*SIZE)); new ((void*)ptr) DERIVED(); //Hier ja leider nur Standard Ctor return (BASE*)ptr; }TYVVM!

-
Pigeon schrieb:
Gibt es da Tricks, boost-magie oder Makros die einem die Standardkonstruktoren der BASISKLASSE bereit stellen? Oder wie wird sowas gemacht....

Die Standardkonstruktoren? Standardkonstruktor gibts höchstens einen pro Klasse. Ich nehme an, du meinst alle Konstruktoren?
Kannst du denn nicht deinen
DERIVED-Standardkonstruktor so einrichten, dass er die Klasse (und damit auch die Basisklasse) wie gewünscht initialisiert? Eventuell verstehe ich dich aber auch falsch...
-
mal abgesehen davon, dass die Schreibweise etwas ungewöhnlich ist (Bezeichner die nur aus Großbuchstaben bestehen sind meistens Makros oder Enums) und die ganzen C-Casts mit den Pointern unnötig sind, ist es für Allokatoren einfach nicht üblich, Konstruktoren aufzurufen. Allokatoren sind einzig zur Speicherbeschaffung da. Wofür willst du die Dinger denn einsetzen?
-
- Ja selbstverständlich meine ich alle Konstruktoren...
...
Das soll dann irgendwie so aussehen können: allokator->alloc(arg1,arg2,blablab);
Ich könnte das ja über den Kopierkonstruktor machen fällt mir gerade ein:saeugetier_t* maus = allokator->alloc(saeugetier_t(nachwuchs,lebensdauer));Dafür müsste dann jede Ableitung per Basis kopierbar sein.
ratte_t::ratte_t(const saeugetier_t&);Wie wär das?

- In Templates schreibe ich die Bezeichner immer groß
aber das lässt sich ja recht fix ändern.
- Die Sind dafür da um an einer Stelle klarzumachen ob irgendeine Ableitung oder die Basis verwendet werden soll. Zudem Gibt der bis zu einer gewisse Menge den Speicher nicht frei um theoretisch schneller neu allokieren zu können. (Aber bis jetzt habe ich da noch keinen UNterschied messen können
).
-
Das kannste von vorn bis hinten in de Tonne treten!
-
Meindl schrieb:
Das kannste von vorn bis hinten in de Tonne treten!
Kann man das auch begründen oder sogar verbessern?

-
biete in der basisklasse new an und lies "effektiv c++ programmieren".
class Base { void* operator new(size_t size,allokator& a) { return a.alloc(size); } }; ... saeugetier_t* s1=new(all) saugetier(nachwuchs,lebensdauer); ratte_t* r1=new(all) ratte(nachwuchs,lebensdauer,nagezahnlaenge);