sizeof anwenden auf Pointer in structs



  • Hi @ all!

    ich habe ein kleines Problem beim anwenden des sizeof-Operators. Hier eine verkuerzte Version meines Problems:

    struct MyStruct
    {
      int a;
      int b;
      float c;
    }
    
    template <class MyStructInClass>
    class MyClass
    {
      MyStructInClass* myStructInClass;
    }
    

    In der Main-Methode versuche ich dann folgendes:

    MyClass<MyStruct> myClass;
    int i = sizeof(myClass);
    

    Dann ist i logischerweise = 4 (Groesse vom Zeiger in der Klasse). Aber auch wenn ich

    int i = sizeof(myClass.myStructInClass);
    

    schreibe, bleibt i = 4.

    Weiss jemand, was ich da machen kann? ich brauche die Groesse von myStructInClass (ohne die struct oder calss zu aendern).

    Thx!



  • i = sizeof(MyStruct);
    

    Bei deiner Variante kriegst du immer die Größe vom Zeiger.



  • Die Loesung war mir bewusst. Sry, hatte vergessen zu sagen, dass der Teil, in dem ich

    i = sizeof(myClass)
    

    aufrufe, die struct gar nicht kennt. Es handelt sich um einen Pointer-Array mit verschiedenen templates, und ich muss darueber iterieren und dann jeweils mit i arbeiten...



  • //
    template <class MyStructInClass>
    class MyClass
    {
    public:
    	static const int size = sizeof(MyStructInClass);
        MyStructInClass* myStructInClass;
    };
    
    ...
    
    int i = myClass.size;
    

    sowas?



  • Hmm...ja, das waere so net schlecht, aber ich wollte eigentlich nicht in der struct und der class rumprogrammieren, aber geht wohl net anders...thx



  • lol ok mir is nochwas eingefallen

    int i = sizeof(*(myClass.myStructInClass));
    


  • Werd|s mal probieren, thx



  • Ok, das klappte. Hatte schon mal

    int i = sizeof(*myClass.myStructInClass);
    

    probiert, aber das von dir klappt, thx!



  • WetDreams schrieb:

    Ok, das klappte. Hatte schon mal

    int i = sizeof(*myClass.myStructInClass);
    

    probiert, aber das von dir klappt, thx!

    "*" hat eine höhere Priorität als der ".".
    Daher bedeutet deine Zeile folgendes für den Compiler:

    (*myClass).myStructInClass
    

    .
    myClass dereferenzieren und dann auf myStrucInClass zugreifen. Und das ist dann natürlich murks.
    Das ist nicht was du willst, daher musst selbst entsprechend die Klammern setzen, wie in meinem Post oben, um die Auswertung der Operatoren zu beeinflussen.


Log in to reply