Forum: PC-Programmierung Array an Konstruktor übergeben (MFC)


von Ampfing (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Ampfing schrieb:

> Gibt es eine der struct zumindest ähnliche Syntax für den
> Konstruktoraufruf der Klasse?

Das ist nicht der springende Punkt.
Der spingende Punkt ist, dass es (noch) keine Syntax gibt die es dir 
erlauben würde ein Array 'on the fly' so zu erzeugen.

von Ampfing (Gast)


Lesenswert?

Hi Karl-Heinz,

den Einwand verstehe ich nicht.
Bei der Struktur erzeuge ich das Array doch auch 'on the fly'. Wieso 
sollte das auf einmal bei der Klasse nicht mehr gehen?

Viele Grüße

von Klaus W. (mfgkw)


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.

von Ampfing (Gast)


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

von yalu (Gast)


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.

von Klaus W. (mfgkw)


Lesenswert?

MS sicher nicht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.