mikrocontroller.net

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


Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
typedef struct
{
   int i[3];
} myStruct_t;

static myStruct_t structInstanz =
{
   { 1, 2, 3 }
};

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

myClass::myClass(int i[3])
{
   for (int j = 0; j < 3; j++)
   {
      m_i[j] = i[j];
   }
}
// soweit kein Thema, aber jetzt das Instantiieren...

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

// das würde gehen, schaut aber nicht so toll aus
static int myArray[3] =  {1, 2, 3};
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.
Ansonsten beim verrückten Ballmer beschweren.

Abgesehen davon kannst du dir ja einen Konstruktor basteln, der
die drei int einzeln als Parameter bekommt.

Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <initializer_list>

class myClass
{
  public:
    myClass(std::initializer_list<int> i);
  private:
    int m_i[3];
};

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

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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MS sicher nicht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.