Array mit Startwerte will nicht

Tonda

Erfahrenes Mitglied
Hallo Leute,

ich habe eine Klasse Datum:
Code:
class Datum
{
public:
          bla;
private:
          int monate[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
          bla;
};

Jetzt spuckt mir der Dev-C++ Compiler die Felhlermeldung:
a brace-enclosed initializer is not allowed here before '{' token.
ISO C++ forbids initialization of member `monate' .
making `monate' static.
invalid in-class initialization of static data member of non-integral type `int[13]'
aus.

Warum kann ich das Array nicht initialisieren?


Echt Komische Sache. Vielleicht hat ja jemand einen Tip.

//edit: Ich fange gerade an mit C++.

Grüsse,
Tonda
 
Zuletzt bearbeitet:
Eine Initialisierung muss beim Konstruktor erfolgen


class Klasse
{
int var;
}

Klasse::Klasse(int a)
: var(a)
{ }
 
Danke für die schnelle Antwort.

Leider klappt Dein Vorschlag nicht, oder vielleicht besser formuliert. Ich kann ihn nicht umsetzen.

Code:
class Datum
 {        
public:               
        Datum(); //Standardkonstrukor               
        Datum(int monate[13]);               
        ~Datum();

private:
          Datum(monate[13])
          :monate[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
};

Was ist der Fehler.

Gruss Tonda
 
Mit einem Array wird das aber trotzdem nicht gehen. Nur Einzelmember (keine Arrays) können in der Initialisierungsliste gesetzt werden. Oder habe ich da was verpasst?
 
Kachelator hat gesagt.:
Mit einem Array wird das aber trotzdem nicht gehen. Nur Einzelmember (keine Arrays) können in der Initialisierungsliste gesetzt werden. Oder habe ich da was verpasst?

Aha, da kommen wir der Sache schon näher. Wie versorge ich ein Array mit Startwerten?


Gruss Tonda
 
Meinst Du so?
Code:
class Datum
{
  public:
           Datum(int monate[13])
           {0,31,28,31,30,31,30,31,31,30,31,30,31;};
};
 
Tonda hat gesagt.:
Meinst Du so?
Code:
class Datum
{
  public:
           Datum(int monate[13])
           {0,31,28,31,30,31,30,31,31,30,31,30,31;};
};

Ich behaupte mal du hast noch nicht ganz verstanden wie eine Klasse instanziert wird. IMMER wenn du ein Objekt einer Klasse erzeugst wird ein Konstruktor aufgerufen, auch wenn du gar keinen erzeugt hast, da dann der Compiler das automatisch macht. Das heisst die Variablen werden auch erst beim Aufruf eines Konstruktors im Heap bzw. Free Store (je nach dem wo das Objekt erstellt wird) initlisiert. Darum kannst du auch erst beim Aufruf eines Konstruktors Werte zuweisen.

Damit man nun nicht zuerst den Default-Konstruktor einer Klasse aufrufen muss und danach einen Wert zuweist wurde die Initlisierungsliste eingeführt. Beispiel:

Code:
// Nur eine fiktive Beispielklasse
class MyInteger
{

  public:  

    int value;
    
    MyInteger()
    {
        cout << "Aufruf des Konstruktors MyInteger()" << endl;
    }
    
    MyInteger(int const& v)
     : value(v)
    {
        cout << "Aufruf des Konstruktors MyInteger(int const& v)" << endl;
    }

    MyInteger& operator = (int const& v)
    {
        cout << "Aufruf des = operators der Klasse MyInteger" << endl;
        this->value = v;
    }
};

// Noch eine Test-Klasse
class TTest
{
    public:
         MyInteger value;
         
         // Die folgende Variante ruft Konstruktor UND Zuweisungsoperator von MyInteger auf
         // TTest(int const& v)
         // {
         //    value = v;     
         // }

         // Diese Variante ruft nur den Konstruktor mit Übergabeparameter auf
         TTest(int const& v)
           : value(v)
         {
         } 
        
};

So weit ist das ganz schön... Da ein Array aber diese Funktionalität nicht unterstützt muss die Werte alle im Konstruktor zuweisen:

Code:
MeineKlasse::MeineKlasse(int * source)
{
    for(int i=0; i<31; ++i)
    {
        this->Werte[i] = source[i];
    }
}

MeineKlasse::MeineKlasse()
{
    this->Werte[0] = 1;
    this->Werte[1] = 45;
    this->Werte[2] = 156;
    // ...
}

[CAPS MODE]
ICH HASSE LEUTE DIE CROSSPOSTINGS IN FOREN VERTEILEN DA FÜHLT MAN SICH ALS HELFER NUR NOCH AUSGENUTZT!
[/caps mode]
 
Zuletzt bearbeitet:
Zurück