Array an Konstruktor übergeben (MFC)

Gast #1374462
Lesenswert?
• ▲
▼
Hallo zusammen,

nachdem ich mittlerweile mein Projekt teilweise nach den Anregungen im 
Post "Alle Member eine struct mit Werten belegen" (s. 
Beitrag "Alle Member einer struct mit Werten belegen" ) abgeändert habe wieder 
mal eine Frage.

Folgendes funktioniert ja wunderbar:
1
typedef struct
2
{
3
   int i[3];
4
} myStruct_t;
5

6
static myStruct_t structInstanz =
7
{
8
   { 1, 2, 3 }
9
};

Jetzt hätte ich gerne eine ähnliche Syntax, wenn die struct zu einer 
Klasse wird. Also sowas:
1
class myClass
2
{
3
   public:
4
      myClass(int i[3]);
5
   private:
6
      int m_i[3];
7
};
8

9
myClass::myClass(int i[3])
10
{
11
   for (int j = 0; j < 3; j++)
12
   {
13
      m_i[j] = i[j];
14
   }
15
}
16
// soweit kein Thema, aber jetzt das Instantiieren...
17

18
static myClass classObject( { 1, 2, 3});  // führt zu ner Compiler-Fehlermeldung ("Es fehlt ) vor {")
19

20
// das würde gehen, schaut aber nicht so toll aus
21
static int myArray[3] =  {1, 2, 3};
22
static myClass classObject2(myArray);

Gibt es eine der struct zumindest ähnliche Syntax für den 
Konstruktoraufruf der Klasse? Erst alles in Arrays reinzupacken und 
diese dann an den Konstruktor zu übergeben ist nicht gerade 
übersichtlich.
Die Parameter nicht als Array sondern als Einzelparameter zu übergeben 
geht nicht, da die Größe des Arrays (entgegen dem obigen Beispiel) von 
einem define abhängt.

Danke im voraus für hilfreiche Antworten und viele Grüße
#1374516
Lesenswert?
• ▲
▼
Der g++ versteht das sehr wohl:
1
static myClass classObject( (int[]){ 1, 2, 3} );

Meines Wissens geht es aber bei VC++ nicht; aber einen Versuch
wäre es wert.
Ansonsten beim verrückten Ballmer beschweren.

Abgesehen davon kannst du dir ja einen Konstruktor basteln, der
die drei int einzeln als Parameter bekommt.
Gast #1374530
Lesenswert?
• ▲
▼
Hi Klaus,

dann werde ich das mal mit VC probieren, auch wenn ich wie gesagt den 
Unterschied zwischen struct und class nicht verstehe...

>Abgesehen davon kannst du dir ja einen Konstruktor basteln, der
>die drei int einzeln als Parameter bekommt.
Das geht leider nicht (siehe erster Post).

Viele Grüße
Gast #1374564
Lesenswert?
• ▲
▼
> Der g++ versteht das sehr wohl:
>
> static myClass classObject( (int[]){ 1, 2, 3} );
>
> Meines Wissens geht es aber bei VC++ nicht; aber einen Versuch
> wäre es wert.

Das (int[]){1,2,3} ist ein Compound-Literal und ist im C99-, aber nicht
im C++-Standard spezifiziert. Der GCC erlaubt das Konstrukt auch in C++
(als Erweiterung), gibt jedoch mit der Compiler-Option -pedantic eine
entsprechende Warnung aus.

Im nächsten C++ (C++0x) wird es so genannte Initializer-Lists geben.
Damit kann man bspw. folgendes schreiben:
1
#include <initializer_list>
2

3
class myClass
4
{
5
  public:
6
    myClass(std::initializer_list<int> i);
7
  private:
8
    int m_i[3];
9
};
10

11
myClass::myClass(std::initializer_list<int> i)
12
{
13
  for (int j=0; j<3; j++)
14
    m_i[j] = i.begin()[j];
15
}
16

17
static myClass classObject({1, 2, 3});

Der GCC unterstützt das ebenfalls, wenn man die Option -std=c++0x
angibt. Beim MS-Compiler müsste man das ausprobieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren