sizeof Frage bei Klassen



  • Angenommen es gibt ein Struct das so aussieht:

    struct V{
    float x,y,z;
    float xn,yn,zn;
    float tu,tv;
    };
    

    Es gibt außerdem eine Funktion, die erwartet, dass ein Objekt dieser Klasse genau 8*sizeof(float) groß ist.
    Jetzt ist dieses struct allerdings ziemlich unbequem, weil es keine Methoden hat, beispielsweise etwa zum Speichern oder Laden in/aus eine/r Datei.
    Es wäre also toll, wenn man davon eine Klasse ableiten würde, in etwa so:

    class V_saveable:public V{
    public:
    bool save(FILE* fptr);
    bool load(FILE* fptr);
    };
    

    Im wesentlichen enthält jetzt V ja eigentlich keine weiteren Daten, aber dafür sind zwei Funktionszeiger dazu gekommen.
    Und vor allem frage ich mich, ob nach wie vor die floats genau in der Reihenfolge im Speicher liegen, wie bei der Grundversion von V_saveable. Weil das ist auch wichtig, dass die floats in einer bestimmten Reihenfolge im Speicher liegen! Oder hat sich möglicherweise die Reihenfolge, in welcher die floats im Speicher liegen, bei der abgeleiteten Klasse V_saveable verändert?

    Jetzt frage ich mich, ob sich das dergestalt auf die Größe des Structs auswirkt, dass sizeof(V_saveable) jetzt etwas anderes liefert als sizeof(V).

    Danke für Erklärungen!



  • Jetzt frage ich mich, ob sich das dergestalt auf die Größe des Structs auswirkt, dass sizeof(V_saveable) jetzt etwas anderes liefert als sizeof(V).

    Probiers doch einfach aus?



  • Warum nicht so:

    class V_wrapper {
    private:
       V v;
    public:
       bool save(FILE* fptr);
       bool load(FILE* fptr);
    };
    

    Damit ist du jedenfalls auf der sicheren Seite was die Größe von V angeht


  • Mod

    .. schrieb:

    Warum nicht so:

    class V_wrapper {
    private:
       V v;
    public:
       bool save(FILE* fptr);
       bool load(FILE* fptr);
    };
    

    Damit ist du jedenfalls auf der sicheren Seite was die Größe von V angeht

    Für diese Sicherheit gibt es keine Anhaltspunkte im Standard. Man könnte möglicherweise so argumentieren, wenn auf private verzichtet wird, V_wrapper also ein POD ist. Der Standard macht nur wenige explizite Aussagen über das Layout von Strukturen. Dem Sinn und Zweck von PODs entsprechend liegt es aber wenigstens nahe anzunehmen, dass in PODs auf unnötiges Padding u.ä. verzichtet wird.



  • Also wirken sich die neu dazu kommenden Funktionen nicht auf die Größe der Objekte aus? Danke!


  • Mod

    Erweiterer schrieb:

    Also wirken sich die neu dazu kommenden Funktionen nicht auf die Größe der Objekte aus? Danke!

    Üblicherweise nicht, wenn sie nicht virtuell sind. Allerdings besteht ja auch keine Notwendigkeit, überhaupt Memberfunktionen einzusetzen, eine freie Funktion kann den selben Zweck genausogut erfüllen. C++ ist kein Java. Das Interface einer Klasse ist nicht auf deren statische oder nicht-statische Memberfunktionen beschränkt.



  • Gegenfrage:

    hast du ein problem es so zu lösen ?

    struct V{
        float x,y,z;
        float xn,yn,zn;
        float tu,tv;
        bool save(FILE* fptr){
            doSth;
        }
        bool load(FILE* fptr);
            doSth;
        }
    };
    

    PS iss alles public und sollte auch funktionieren wenn du in den methoden keine nichtstatischen werte verwendest



  • Ceos schrieb:

    Gegenfrage:

    hast du ein problem es so zu lösen ?

    struct V{
        float x,y,z;
        float xn,yn,zn;
        float tu,tv;
        bool save(FILE* fptr){
            doSth;
        }
        bool load(FILE* fptr);
            doSth;
        }
    };
    

    PS iss alles public und sollte auch funktionieren wenn du in den methoden keine nichtstatischen werte verwendest

    Danke für Eure Tipps! Ich werd's so probieren!



  • dem möcht ich noch hinzufügen das es auf möglich ist einen kontruktor in die struct zu packen, falls du die werte initialisieren willst.

    ALLERDINGS musst du dir einen kopierkontruktor anlegen wenn du zeiger in der struktur verwendest ....

    struct erbt von struct geht auch ...

    eigentlich kann man vieles was eine klassische klasse hat auch im struct machen...

    kann man eigentlich auch arrays und objekte in dem struct erzeugen wenn man sie an zeiger des struct bindet und im destruktor wieder freigibt ????



  • @Ceos:

    es geht nicht um struct vs. class... "POD oder nicht POD, das ist hier die Frage".

    kann man eigentlich auch arrays und objekte in dem struct erzeugen wenn man sie an zeiger des struct bindet und im destruktor wieder freigibt ????

    Nein, das hat der Osterhase letztes Jahr verboten.


Log in to reply