Strukturen ableiten



  • Den "Mechanismus" wie in C++ gibt es natürlich nicht in C, beide Sprachen verfolgen auch unterschiedliche Konzepte.

    Aber,

    Rock Lobster schrieb:

    Mir ist bewußt, daß man innerhalb einer Struktur eine andere Struktur haben kann

    ist vom Sinn her

    Rock Lobster schrieb:

    Erweitern, sodaß an die ursprüngliche Struktur noch was angehängt wird.

    Nur stellt C dafür keine Sprachmittel zur Verfügung, da wie ich schon erwähnte C und C++ beide andere Konzepte verfolgen.



  • CStoll schrieb:

    Ableitung gibt es nur in C++ (eigentlich nur für class - aber in C++ sind struct und class nahezu äquivalent). In C gibt es noch kein Klassenkonzept, aber über Casting-Tricks, kannst du struct's als etwas anderes ansprechen:

    struct base
    {
      int x,y;
    };
    struct derived
    {
      int x,y;
      double weight;
    };
    
    ...
    derived d;
    base* pb = (base*)&d;
    

    (sieht übel aus - und wenn du damit anfängst, bist du auf dich alleine gestellt)

    Würde ich so nie machen, selbst wenn ich Vererbung simulieren möchte. Eher so

    struct base
    {
      int x,y;
    };
    struct derived
    {
      struct base bla;
      double weight;
    };
    

    So bekommst du noch einen "sauberen" up- und downcast hin.



  • Soll ich dir was verraten? Ich würde sowas auch nicht machen (ich würde gleich auf C++ ausweichen ;)). Aber in C-Bibliotheken scheint sowas üblich zu sein (vergleich mal die Beziehungen zwischen 'sockaddr', 'sockaddr_in' und Kollegen ;)).



  • Naja also genau um das Casten geht es mir eigentlich auch. Bei Deinem Beispiel ist es aber so, daß ich zwar problemlos casten kann, aber wenn ich NICHT casten will und dennoch auf die Basiselemente zugreifen will, hab ich halt keinen direkten Zugriff, sondern ich muß immer über die innere Struktur gehen:

    derived d;
    d.weight = 5.3;
    d.base.x = 3;
    d.base.y = 7;
    

    In diesem Fall wäre CStolls Lösung wieder besser, aber dafür muß man die ganzen Elemente in den abgeleiteten Strukturen wiederholen, was halt wiederum fehleranfällig ist.

    Aber zumindest gut zu wissen, daß es auf irgendeine Art und Weise funktioniert 🙂



  • Rock Lobster schrieb:

    In diesem Fall wäre CStolls Lösung wieder besser, aber dafür muß man die ganzen Elemente in den abgeleiteten Strukturen wiederholen, was halt wiederum fehleranfällig ist.

    Irgendeinen Kompromiss muß man immer eingehen, wenn man schlauer als der Compiler sein will 😃 (und langfristig gefällt mir Tester's Variante auch besser)



  • <NON-STANDARD-C>

    Beim gcc kann man es z.B. wie folgt machen:

    /* struct.c */
    
    typedef struct {
    	int foo;
    	double bar;
    } base_t;
    
    typedef struct {
    	int baz;
    	base_t;
    } derived_t;
    
    int main(void) {
    	derived_t derived;
    	derived.foo = 3;
    	derived.bar = 3.14;
    	derived.baz = 3;
    
    	return 0;
    }
    
    gcc struct.c -o struct -Wall -fms-extensions
    

    </NON-STANDARD-C>

    Ich würde aber davon abraten. Wenn C, dann C. Wenn C++, dann C++.



  • Tim schrieb:

    Ich würde aber davon abraten. Wenn C, dann C. Wenn C++, dann C++.

    wenn ihr OOP mit C machen wollt, dann hilft vielleicht das: http://www.planetpdf.com/codecuts/pdfs/ooc.pdf
    http://www.mathematik.uni-ulm.de/sai/ws96/seminar/neher/
    🙂



  • pale dog schrieb:

    Tim schrieb:

    Ich würde aber davon abraten. Wenn C, dann C. Wenn C++, dann C++.

    wenn ihr OOP mit C machen wollt, dann hilft vielleicht das: http://www.planetpdf.com/codecuts/pdfs/ooc.pdf
    http://www.mathematik.uni-ulm.de/sai/ws96/seminar/neher/
    🙂

    Das erste Buch hab ich mir mal vor Ewigkeiten durchgelesen, ist ganz nett, man kann sein Wissen über C um einige "Techniken" bereichern, die sind aber größtenteils auf sehr viel Schreibaufwand basierend. Für OOP dann doch lieber C++. 🙂



  • Rock Lobster schrieb:

    Naja also genau um das Casten geht es mir eigentlich auch. Bei Deinem Beispiel ist es aber so, daß ich zwar problemlos casten kann, aber wenn ich NICHT casten will und dennoch auf die Basiselemente zugreifen will, hab ich halt keinen direkten Zugriff [...]

    Schreib dir doch Set und Get Funktionen für die Werte ;).



  • Auch wieder wahr 😉


Anmelden zum Antworten