C++ Erweiterte Initialisierungslisten in Standard-C++

badday

Commander
Registriert
Sep. 2007
Beiträge
3.023
Moin zusammen,

ich schreibe gerade an einem Programm, dass auf erweiterte Initialisierungslisten (extended initializer lists) zurückgreift, die bei C++0x verfügbar sind (siehe http://www2.research.att.com/~bs/C++0xFAQ.html#init-list ).
Da das Programm aber auch von anderen benutzt wird, die Compiler benutzen, die das nicht (zumindest nicht out-of-the-box) unterstützen, suche ich nach einem Pendant, der Standard-C++ (und damit ISO/IEC 14882:1998 ) entspricht.

Konkret geht es um soetwas:
Code:
 a =
           {
                   {"example", l_example},
                   {"second", l_second},
                          {NULL, NULL}
               };

Also eigentlich etwas wirklich banales.

Wenn also jemand eine Lösung weiß, wäre ich sehr dankbar.

Gruß,

badday
 
Dir wird unter Standard C++ nichts anderes übrig bleiben, als das Array im Konstruktor und nicht in der Initialisierungsliste zu initialisieren.
 
Wenn du mit Initialisierungsliste die Elementinitialisierungsliste meinst (so verstehe ich dich), muss ich dich enttäuschen, dass ganze läuft im Konstruktor der Klasse ab.
Aber vielleicht habe ich dich auch falsch verstanden, mir ist nicht ganz klar, was du meinst. Wäre gut, wenn du das erklären könntest :-)

Gruß,

badday
 
Kannst du ein bisschen genauer erklären, was du vorhast? Meine Idee wäre gewesen, in der Klasse ein Array in entsprechender Größe anzulegen und dieses dann direkt in der Implementierung des Konstruktors Element für Element zu initialisieren - in etwa so:

Code:
m_Array[0].Text = "example";
m_Array[0].Length = l_example;
m_Array[1].Text = "second";
m_Array[1].Length = l_second;
 
Ich hab gerade noch einmal bei meinen alten Quellcodes mit LUA durchgesehen, und dabei hatte ich dieses Array immer als statische Membervariable - diese kannst du dann in der Quellcode-Datei so initialisieren, wie du es bisher gemacht hast. Ich denke, dass es bei dir zwar auch nicht anders ist, aber du kannst mit dieser Vorgehensweise natürlich auch nur auf statische Methoden der Klasse zugreifen. Willst du simulierte Objekte unter LUA haben, so habe ich damals die Erweiterung Lunar verwendet - jedoch wird auch bei dieser das Array als statische Membervariable angelegt.
 
Ich wollte das eigentlich auch als statisches Array machen, allerdings funktionierte das aus irgendeinem Grund nicht (siehe https://www.computerbase.de/forum/threads/problem-mit-einem-konstanten-statischen-array.706439/ ).

Und bei einem statischen Array werden erweiterte Initialisierungslisten unterstützt?

Gruß,

badday

EDIT: Ich habe das ganze jetzt statisch gemacht und es funktioniert nun (warum es das vorher nicht getan hat, weiß ich auch nicht^^). Allerdings sagt der Compiler weiterhin:
Warnung: extended initializer lists only available with -std=c++0x or -std=gnu++0x
 
Zuletzt bearbeitet:
script.h
Code:
 static luaL_Reg  mylib [10] ;
script.cpp
Code:
luaL_Reg Script::mylib [] = {};

Script::Script()
{

    mylib=
           {
                   {"example", l_example},
                   {"PushButton", l_pushButton},
                          {NULL, NULL}
               };
//...
}
 
Ich bin eher verwundert, dass es in dieser Form überhaupt funktioniert. Eigentlich gehört es so:

script.cpp
Code:
luaL_Reg Script::mylib [] =
{
    {"example", l_example},
    {"PushButton", l_pushButton},
    {NULL, NULL}
};

Script::Script()
{
}
 
Klar, aber ich war mir ziemlich sicher, das früher schonmal versucht zu haben und es wurde nicht befüllt (siehe anderer Thread).
Habe es nun nochmal versucht und was soll ich sagen: Es funktioniert. Ich weiß zwar nicht, warum es vorher nicht ging (es muss an irgendetwas anderem gelegen haben), jedenfalls passt es nun!

Vielen Dank, Simpson474!

Gruß,

badday
 
Zurück
Oben