static const struct Definition



  • Warum nicht so?

    struct MyStruct
    {
      CBtnClass *ptr; 
      CAnotherClass *pClass2; 
      int value;
    
      explicit MyStruct(CBtnClass *ptr=0, CAnotherClass *pClass2=0, int value=0)
      : ptr(ptr), pClass2(pClass2), value(value) {}
    };
    
    class MyClass
    {
      ...
      std::vector<MyStruct> svec;
      ...
    };
    
    ...
    
    void MyClass::Init()
    {
      svec.clear();
      svec.push_back(MyStruct(0,0,0));
      svec.push_back(MyStruct(&foo,&bar,42));
    }
    


  • Vermutlich möchte er das Array statisch initialisieren, und das können die von Euch gezeigten Lösungen beide nicht.

    @OP: was ist denn das Problem? IMO müsste das so oder so ähnlich gehen. Wenn nicht, versuch dem Ding mal nen Namen zu geben, und Deklaration der Klasse und des Arrays zu trennen.

    p.S.: Die Bedingung in deiner for-Schleife ist natürlich kaputt, und logischerweise kann man in einer Funktion auch nicht auf die lokalen Variablen einer anderen Funktion zugreifen, auch wenn diese static sind.
    -> Zieh das ganze in einen anonymous Namespace raus.



  • hustbaer schrieb:

    Vermutlich möchte er das Array statisch initialisieren, und das können die von Euch gezeigten Lösungen beide nicht.

    @OP: was ist denn das Problem? IMO müsste das so oder so ähnlich gehen. Wenn nicht, versuch dem Ding mal nen Namen zu geben, und Deklaration der Klasse und des Arrays zu trennen.

    Wenn ich die struct außerhalb der Klasse definiere, kann ich ja nicht mehr auf die protected member zugreifen (wie in meinem Bsp. die beiden Pointer).

    static const struct 
      {
           CBtnClass *ptr; 
           CAnotherClass *pClass2; 
           int value;
      } Array[] = {/* array initialisierung*/};
    

    Was ich auf jeden Fall erreichen möchte, ist dass ich zu Beginn keine Size vom Array dieser Struct eingeben muss! Also dass ich nicht Array[10] oder so ähnlich schreiben muss sondern sofort die Initialisierung vornehmen kann. Kommen weitere Items irgendwann noch dazu, muss nichts upgedated werden.



  • Jack-the-Cop schrieb:

    Ich möchte gern in Array von dieser struct initialisieren, allerdings nicht mit einer festen Größe zu Beginn.

    Was heißt denn "nicht mit einer festen Größe zu Beginn" genau?

    Ich muss SeppJ recht geben, dass das alles sehr komisch klingt. Dir ist wahrscheinlich besser geholfen, wenn Du mehr über das verrätst, was Du eigentlich machen willst. Du kannst Dir auch nochmal das hier durchlesen, speziell die Punkte
    - "Stell deine Fragen präzise."
    - "Frage nach dem, was du erreichen willst und nicht danach womit du es erreichen willst."

    Gruß,
    kk



  • man kann das Array ja mit einer festen Größe definieren oder nicht

    a) keine feste Größe

    static const struct 
      { 
           CBtnClass *ptr; 
           CAnotherClass *pClass2; 
           int value; 
      } Array[] = {/* array initialisierung*/};
    

    b) feste Größe

    static const struct 
      { 
           CBtnClass *ptr; 
           CAnotherClass *pClass2; 
           int value; 
      } Array[10] = {/* array initialisierung*/};
    

    Des Weiteren möchte ich bei der Initialsiierung gleich alles in den geschweiften Klammen angeben können wie in b (untere code-box). Die Werte von diesem Array sind und bleiben während des ganzen Programms die gleichen

    //a
    Array[0].ptr = &m_ptr1; 
    Array[0].pClass2 = &m_clasptr1; 
    //usw
    
    //b
    Array[10] = {{&m_ptr1, &m_classptr1, 20}, {}, {}};
    

    Ich hoffe es ist jetzt etwas verständlicher geworden.



  • Jack-the-Cop schrieb:

    man kann das Array ja mit einer festen Größe definieren oder nicht

    a) keine feste Größe

    static const struct 
      { 
           CBtnClass *ptr; 
           CAnotherClass *pClass2; 
           int value; 
      } Array[] = {/* array initialisierung*/};
    

    Natürlich hat das Array eine feste Größe. Und die Größe hängt davon ab, was Du alles so in der Initialisierungsliste schreibst. Du überlässt nur das Zählen dem Compiler.

    Jack-the-Cop schrieb:

    Des Weiteren möchte ich bei der Initialsiierung gleich alles in den geschweiften Klammen angeben können wie in b (untere code-box).

    Was hindert Dich denn daran?

    Anyhow.... sieht immer noch nach einem unglücklichem Design aus. Verbesserungsvorschläge bekommst Du höchstens dann, wenn Du mehr über das verrätst, was Du eigentlich machen willst...



  • Er.
    Ich glaube das ist wirklich grosser Unfug was du da machen willst.
    Wenn "m_ptr1" ein non-static Member deiner Klasse ist, dann hat das in jeder Instanz eine andere Adresse.
    D.h. ein static-const Array mit so einer Adresse zu initialisieren ist in den allermeisten Fällen Unfug.



  • hustbaer schrieb:

    Er.
    Ich glaube das ist wirklich grosser Unfug was du da machen willst.
    Wenn "m_ptr1" ein non-static Member deiner Klasse ist, dann hat das in jeder Instanz eine andere Adresse.
    D.h. ein static-const Array mit so einer Adresse zu initialisieren ist in den allermeisten Fällen Unfug.

    Kann man das vielleicht nicht einfach so lösen...

    //headerfile
    
    typedef struct {
     //all members
    }ARRAY; 
    
    class xyz 
    {
      static const ARRAY arr[]; 
    
      protected:
    
      CBtnClass *m_ptr; 
      CAnotherClass *m_pClass2; 
      int m_value; 
    };
    
    //in cpp
    static const xyz::ARRAY arr[] ) {&m_ptr, &m_pClass2, m_value... usw};
    

    Vielleich hilfts 🙂
    Jochen



  • wenn es jetzt noch funktionieren würde, wäre es genau das was ich suche 😕



  • Jack-the-Cop schrieb:

    ...genau das was ich suche...

    Das ist ja das Problem, dass Du danach suchst ... quasi mit Scheuklappen für alternative Lösungsansätze deines eigentlichen Problems -- was immer das auch ist (hint hint). :p

    Ich verweise nochmal auf vorletzten Punkt des Du brauchst Hilfe?-Posts.



  • Jochen Schlatmann schrieb:

    hustbaer schrieb:

    Er.
    Ich glaube das ist wirklich grosser Unfug was du da machen willst.
    Wenn "m_ptr1" ein non-static Member deiner Klasse ist, dann hat das in jeder Instanz eine andere Adresse.
    D.h. ein static-const Array mit so einer Adresse zu initialisieren ist in den allermeisten Fällen Unfug.

    Kann man das vielleicht nicht einfach so lösen...

    Nein, kann man nicht.
    Es kann auch nicht gehen, was offensichtlich sein sollte. Zumindest wenn man sich mal 2 Min. hinsetzt und darüber nachdenkt.


Anmelden zum Antworten