Static Array!! Deklarieren?
-
und wie kann ich denn ein nicht statisches konstantes array füllen?
class blubb { private: const int m_data[3]; }; const int blubb::m_data[3]= { 1, 2, 3 };geht ja nicht
-
frager schrieb:
und wie kann ich denn ein nicht statisches konstantes array füllen?
Gar nicht.
-
Wieso könnte er kein const_cast<type> verwenden? Mal davon abgesehen das wenn er es sowieso ändern will, die Frage offensteht warum er es konstant haben will?

-
Danke, an alle!
war genau das was ich wissen wollte!!
muli
-
Du könntest auch...
#include <valarray>benutzen und ein valarryObjekt erzeugen...
Sollte laut Ansi C++ Standard die bevorzugte Umwandlung eines C-Arrays in ein Valarray-Objekt sein
valarray (const MAX_ANZSPRITES*, int 4);und dann kannst du mit der Hilfsklasse gslice...
gslice (size_t s, const valarray<size_t>& len, const valarray<size_t>& d);AnsiC++ Standard: Erzeugt ein gslice-Objekt. Eine mehrdimensionale Indizierung wird in einen eindimensionalen Index umgewandelt. Damit können Elemente aus einem valarray ausgewählt werden.
Wenn alle Klassen auf das gleiche zurückgreifen sollen kannst du für jede Klasse eine eigene Indizierung vornehmen und in einen öffentlichen eindimensionalen Index umwandeln...
'Hoffe das hilft dir weiter... ;)...und hoffe ich hab keinen Denkfehler...

-
Man könnte auch im .cpp File einfach
static int Klasse::RenderList[MAX_ANZSPRITES][4] = {};schreiben und das wars dann. Reicht wie schon Freak_Coder geschrieben hat völlig aus.
Wenn du was anderes als 0 drinnen stehen haben willst, und die Werte nicht alle mit Hand eingeben, sondern beim Programmstart in einer Funktion berechnen und reinschreiben, kannst du folgenden Trick verwenden:
static int Klasse_RenderList_Init() { // hier Werte berechnen und nach Klasse::RenderList reinschreiben return 0; } static int Klasse::RenderList[MAX_ANZSPRITES][4]; static int Klasse_RenderList_Init_Helper = Klasse_RenderList_Init();Mit einem const Array geht das leider nicht, da C++ AFAIK keine Möglichkeit bietet const Arrays mit einer Schleife zu initialisieren (ausser const_cast, und von const_cast würde ich bei Objekten die wirklich selbst const sind die Finger lassen, das mag der Standard nämlich auch nicht -- ist bloss ein Zeiger bzw. eine Referenz const, das Objekt selbst aber mutable ist es allerdings OK).
Allerdings kann man hier immer noch eine const Referenz auf das Array als Member der Klasse haben, und das Array selbst dann mutable und static im .cpp File. Dann kann man das auch schön mittels so eines "init-helpers" anfüllen.
-
hustbaer schrieb:
...von const_cast würde ich bei Objekten die wirklich selbst const sind die Finger lassen, das mag der Standard nämlich auch nicht -- ist bloss ein Zeiger bzw. eine Referenz const, das Objekt selbst aber mutable ist es allerdings OK...
Dann braucht man auch kein const_cast, oder ?
namespace { static int arr[] = { 1, 2, 3, 4, 5 }; } static int const *carr = arr;müsste auch funktionieren. Dann kann man arr[] über Deinen Mechanismus (in einem eigenen Modul) initialisieren ... nach Außen sichtbar ist er allerdings nur über den konstanten
carrsichtbar....
Nachteil:carrist kein Array mehr und deswegen muss seine Größe extern (z.B. über eine eigene Konstante) festgehalten werden...EDIT: Hmmm, bislang habe ich's noch nciht hinbekommen, ... nochmal probieren.
Gruß,
Simon2.
-
Ich dachte mutable soll man nur einsetzten wenn es den Status des Objektes an sich nicht verändert?
class Beispiel { public: void render() const; ..... // irgendwas private: ..... // irgendwas mutable unsigned int accessCount; } void Beispiel::render() const { // macht irgendwas... ++accessCount; }Oder lieg ich grad auf dem Holzwerg?

-
'mutable' verwenden Programmierer mitunter als Gegenstück zu 'const' - das taucht dann nicht im eigentlichen Programmcode auf, aber nach der Definition ist
int var;'mutable' undconst int& ref = var;eine konstante Referenz auf eine eigentlich veränderliche Variable. Das heißt, dort könntest du per const_cast die Variable doch wieder verändern, ohne daß es Probleme gibt (außer mit dem Anwender, der erwartet, daß du die Variable nicht veränderst). Wenn ref dagegen auf eine echte Konstante verweist, kracht es zur Programm-Laufzeit, wenn du versuchst, es zu const_cast'en.(und das Schlüsselwort 'mutable' besagt technisch, daß das Element auch für eigentlich konstante Objekte veränderber sein soll - semantisch ist man gut beraten, wenn sich dieses Element nicht auf den "offiziellen" Objektstatus auswirkt)
-
Danke für die präzise Antwort, hat den Nebel gelichtet wie man so schön sagt
