🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #2127

Re: How initialize static member arrays?

#2127
From: Dietmar Kuehl
Date: Mon, 15 Apr 1996 15:22
111 lines
3511 bytes
Hi,

Bernhard Ruch (Bernhard.Ruch@studi.epfl.ch) wrote:
: Karl-Heinz Krause wrote:
: > > How can I initialize an array that is a static member
: > > of a class?
: > 
: > > e.g.
: > 
: > >   class A {
: > >     private:
: > >       static int stat_int[20];
: > >   };
: > 
: > Kein Problem:
: > 
: >     class A {
: >         static int stat_int[20];
: >     };
: > 
: >     int A::stat_int[] = { 1, 2, 3, 4 };
: > 
: > Karl-Heinz Krause

: Ok, dies geht sehr gut fuer ein Array der Groesse 20,
: aber was macht man, wenn man ein Array der Groesse 50000
: initialisieren muss?

Das haengt ein wenig davon ab, wie es initialisiert werden soll: Wenn
alle Werte gleich sein sollen, dann deklariert man das Array einfach
ein wenig anders und es gibt kein Problem mehr:

  #include <vector>
  class A {
    static vector<int> stat_int;
  };

  extern int init_size;
  extern int init_val;
  vector<int> A::stat_int(init_size, init_val);

Natuerlich koennen 'init_size' und 'init_val' auch Literale sein.

Wenn man das Array mit verschiedenen Werten initialisieren will, dann
muss man sich etwas ausdenken, wie man diese Werte bestimmen kann und
kann eine Hilfsklasse verwenden:


  #include <vector>

  template <class T>
  class vector_init
  {
  public:
    vector_init(vector<T> &vec, T (*init_val)(int))
    {
      int idx = 0;
      for (vector<T>::iterator it = vec.begin(); it != vec.end(); ++it)
	*it = init_val(idx++);
    }
  };

  class A
  {
    static vector<int> stat_int;
    static vector_init<int> stat_int_init;
  };

  int init(int idx) { return idx; }

  extern int init_size;

  vector<int>      A::stat_int(init_size);
  vector_init<int> A::stat_int_init(A::stat_int, init);

Uebrigens sollte man sich darueber klar sein, dass wenn man nicht ein
built-in Array mit einer Initializer-Liste initialisiert, die
Reihenfolge der Initialsierung nicht feststeht.  Ggf. ist es dann
besser, anstatt statischen Daten eine Funktion zu verwenden, die die
statischen Daten einkapselt und initialisiert:

  #include <vector>
  class A
  {
    static vector<int> &stat_int();
  };

  int init(int idx) { return idx; }

  // Deklaration von 'vector_init' wie oben

  extern int init_size;

  vector<int> &A::stat_int()
  {
    static vector<int>      stat(init_size);
    static vector_init<int> stat_init(stat, init);

    return stat;
  }

Dadurch wird sichergestellt, dass die statischen Daten auf jeden Fall
konstruiert sind, wenn darauf zugegriffen wird. Das ist sonst nicht so
leicht zu garantieren. Allerdings wird mit dieser Technik nicht
garantiert, dass die Daten ueberhaupt irgendwann konstruiert werden:
Wenn nicht auf 'stat_int()' zugegriffen wird, wird der Vektor auch
nicht konstruiert.
--
dietmar.kuehl@uni-konstanz.de
http://www.informatik.uni-konstanz.de/~kuehl/
I am a realistic optimist - that's why I appear to be slightly pessimistic
Technical Details
Message-ID: <4ktpje$qfg@news.BelWue.DE>
Path: arc1-ca.pugleaf.net!news.belwue.de!uzwil!kuehl
References: <4kg90n$2c9@netlab.cs.rpi.edu> <4kjghq$pqa@news00.btx.dtag.de> <31720552.2781@studi.epfl.ch>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news.belwue.de!uzwil!kuehl
From: kuehl@uzwil.informatik.uni-konstanz.de (Dietmar Kuehl)
Newsgroups: de.comp.lang.c++
Subject: Re: How initialize static member arrays?
Date: 15 Apr 1996 15:22:22 GMT
Organization: Fakultät für Mathematik und Informatik
Message-ID: <4ktpje$qfg@news.BelWue.DE>
References: <4kg90n$2c9@netlab.cs.rpi.edu> <4kjghq$pqa@news00.btx.dtag.de> <31720552.2781@studi.epfl.ch>
Reply-To: dietmar.kuehl@uni-konstanz.de
NNTP-Posting-Host: uzwil.informatik.uni-konstanz.de
X-Newsreader: TIN [version 1.2 PL2]