Arrays von Objekten initialisieren



  • Hi,

    habe folgendes Problem:

    ich möchte nicht ein einzelnes Objekt initialisieren, sondern gleich ein ganzes Array.

    Früher habe ich es mit structs gemacht:

    static GtkItemFactoryEntry menu_array[10] =
    {
      { "/_Datei"     , NULL        , NULL         , 0, "<Branch>" }, // je eine struct
      { "/Datei/Pilot-Profil" , "<control>P", (fc*)funk_datei, 1,  "<StockItem>", GTK_STOCK_OPEN },
    

    ...usw

    geht so etwas auch mit Objekten?

    Gruß,
    Johannes



  • Klar, wenn die Objekte Konstruktoren haben:

    MyClass Array[10] = { MyClass(1),MyClass(2,"echo")};
    

    (alle Elemente, die du nicht explizit nennst, werden mit Default-Ctor (der muß existieren) initialisiert)



  • Wow, vielen Dank. 🙂 Wahnsinn ich habe ein 400-Seiten-Buch über C++ gelesen, da stand nix darüber... Woher weißt Du sowas?

    Nebenbei: Sag bloß, das geht auch mit 3dimensionalen Arrays?

    MyClass Array[10][10] = { MyClass(1,1),MyClass(1,2,"echo")};
    

    ?



  • Die richtigen Bücher gelesen (und dann praktisch ausprobiert) 😃

    Ehe ich es vergesse: Ja, das geht auch mit mehrdimensionalen Arrays



  • vielen Dank! Leider funktioniert es noch nicht.

    MenuElem m[10] { MenuElem(1,"Pilot-Profile") };

    ergibt beim g++ leider:

    ./menus.h:59: error: function definition does not declare parameters
    

    was ist hier falsch?



  • Ja, wenn du das = bei der Initialisierung weglässt, gefällt das C++ gar nicht 😉



  • Sry den hab ich voll übersehen. Klappt nun... Nochmals vielen dank!



  • oha...

    string s[2] = { string(0,"hi"),string(1,"echo")};
    

    geht gar nicht... das erste argument (0 und 1) ist doch gar kein index-Argument, oder?

    string s[2] = { string("hi"),string("echo")};
    

    so geht es dann nämlich...



  • voidpointer schrieb:

    oha...

    string s[2] = { string(0,"hi"),string(1,"echo")};
    

    geht gar nicht... das erste argument (0 und 1) ist doch gar kein index-Argument, oder?

    Nein, die Argumente werden so, wie sie dort angegeben sind, an deinen Konstruktor weitergegeben - der Index der entsprechenden Elemente ergibt sich aus der Reihenfolge, in der sie genannt werden (du kannst nur die ersten n Elemente initialisieren und nicht einzelne Elemente herauspicken).

    (obwohl, ich meine micht zu erinnern, daß man in C99 festlegen konnte, welche Array-Elemente initialisiert werden sollten)



  • Danke. Nun wollte ich das ganze noch in den Konstruktor eines Objekts (namens MyMenuBar) rein hauen (weil das Array erst dann initialisiert werden darf)... leider geht das nicht so leicht 😞

    MenuElem all_menu_items[3];
    //...
    MyMenuBar( void ): all_menu_items( { MenuElem("Pilot-Profile"), MenuElem("Update"), MenuElem("Bla") } )
    { /* konstruktor */ }
    

    der compiler behauptet:
    ./menus.h:89: error: expected primary-expression before ‘{’ token
    ./menus.h:89: error: bad array initializer

    (wie) ist so etwas möglich? o_O



  • Ger nicht - C Initialisierungslisten und C++ Konstruktoren sind nicht wirklich miteinander kompatibel. d.h. du mußt das Array im Ctor-Rumpf von Hand befüllen.



  • Ginge es denn eigtl. so, dass man die Array-elemente alle einzeln initialisiert??

    MainWindow::MainWindow(void)
    	:img[0](this,"images/label/d.png",'D'), // Fehler 1
    	(img[1])(this,"images/label/d.png",'3'), // Fehler 2
            //...
    

    Ich bekomme andauernd Fehler:

    Fehler 1:

    g++ schrieb:

    error: expected `{' before ‘[’ token

    Fehler 2:

    g++ schrieb:

    error: anachronistic old-style base class initializer

    Gruß,
    voidpointer



  • CStoll schrieb:

    Ger nicht - C Initialisierungslisten und C++ Konstruktoren sind nicht wirklich miteinander kompatibel. d.h. du mußt das Array im Ctor-Rumpf von Hand befüllen.

    Gilt auch im neuen Jahr 😉



  • Mensch bin ich vergesslich 😛

    Is halt echt nen riesen-Nachteil von C++ 😞 So kann ich in vielen fällen keine Konstanten Variablen in meine Objekte einbauen...


Anmelden zum Antworten