struct teil 2

  • struct teil 2

    liebe c-coder,

    ich habe noch 'ne struct-frage:
    ist es möglich den objektorientierten ansatz auch in c zu simulieren, speziell objekt-methoden?
    bisher habe ich es gemacht, indem ich strukturen angelegt habe (mit member-variablen) und dann funktionen drauf angewendet habe. aber was is mit member-methoden?
    ich weiß, dass man pointer auf funktionen erstellen kann. mein compiler hat nicht gemeckert, als ich den pointer auf 'ne funktion in einer struktur erstellt habe.
    aber wie könnte man die verbindung zur struktur (sprich klasse) in der funktion herstellen?
    fazit:
    gibt es eine möglichkeit, struct-member-methoden zu erstellen?

    gruss
    chris
  • Hab mal nen kleines Beispiel fertig gemacht in dem einige grundlegende OOP Geschichten wie Methoden/Vererbung und Polymorhie mit C simuliert werden.
    Da das Ganze,im Gegensatz zu C++ ,keinerlei Überprüfung seitens des Compilers unterliegt ,sind solche Mätzchen aber ne ziemliche Gratwanderung :wink: .

    Quellcode

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. //Die Anwendung simuliert mit C grundlegende objektorientierte Eigenschaften
    4. typedef struct _kfz kfz;
    5. typedef void(*kfz_printer)(kfz*);
    6. //"Basisklasse"
    7. struct _kfz
    8. {
    9. char* bezeichnung;
    10. int baujahr;
    11. kfz_printer print_data;//"Methode" um Daten anzuzeigen
    12. };
    13. void print_kfz_data(kfz* this)
    14. {
    15. printf("Ich bin ein KFZ\n");
    16. printf("Bezeichnung: %s\nBaujahr: %d\n\n",this->bezeichnung,this->baujahr);
    17. }
    18. //"Konstruktor"
    19. kfz* kfz_K(char* _bez,int _baujahr)
    20. {
    21. kfz* new_kfz = (kfz*)malloc(sizeof(kfz));
    22. new_kfz->bezeichnung = _bez;//nur zur Demo keine tiefe Kopie
    23. new_kfz->baujahr = _baujahr;
    24. new_kfz->print_data = print_kfz_data;
    25. return new_kfz;
    26. }
    27. typedef struct _pkw pkw;
    28. typedef void(*pkw_printer)(pkw*);
    29. //"Subtyp"
    30. struct _pkw
    31. {
    32. char* bezeichnung;
    33. int baujahr;
    34. pkw_printer print_data;
    35. int tueren;
    36. };
    37. void print_pkw_data(pkw* this)
    38. {
    39. printf("Ich bin ein PKW\n");
    40. printf("Bezeichnung: %s\nBaujahr: %d \nAnzahl Tueren: %d\n\n",this->bezeichnung,this->baujahr,this->tueren);
    41. }
    42. pkw* pkw_K(char* _bez,int _baujahr,int _tueren)
    43. {
    44. pkw* new_pkw = (pkw*)malloc(sizeof(pkw));
    45. new_pkw->bezeichnung = _bez;//nur zur Demo keine tiefe Kopie
    46. new_pkw->baujahr = _baujahr;
    47. new_pkw->print_data = print_pkw_data;
    48. new_pkw->tueren = _tueren;
    49. return new_pkw;
    50. }
    51. int main()
    52. {
    53. int idx;
    54. kfz* fahrzeuge[3];
    55. fahrzeuge[0]= kfz_K("Test",1999);
    56. //C kennt keine Subtypen also ist ein expliziter Cast nach kfz* erforderlich
    57. //die Verantwortung dass pkw alle "Methoden/Attribute" enthält die kfz benötigt,und dass diese in der richtigen
    58. //Reihenfolge im Speicherliegen,liegt beim Programmierer
    59. fahrzeuge[1]=(kfz*)pkw_K("Volvo V40",2003,5);
    60. fahrzeuge[2]=(kfz*)pkw_K("Peugeot 106",1999,3);
    61. for(idx=0;idx<3;++idx)
    62. {
    63. fahrzeuge[idx]->print_data(fahrzeuge[idx]);//Polymorphie für Arme
    64. free(fahrzeuge[idx]);
    65. }
    66. return 0;
    67. }
    Alles anzeigen


    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)
  • hi void,

    danke für dieses super beispiel (so arm is deine polymorphie doch gar nicht...).
    wie's aussieht muß man den zeiger auf das "objekt" in jede "methode" mit übergeben. klingt ja irgendwie logisch. is aber auch nicht wirklich schön.
    wie läuft das denn in der objektorientierten programmierung? dort is der datenbereich vom codebereich sicherlich auch getrennt, oder?
    wenn dort von einem codesegment in ein anderes codesegment gesprungen wird (aufruf einer methode); welcher zusammenhang besteht dann zwischen objektdaten und methodencode?

    gruss
    chris
  • Hi,
    bevor ich dieses komplexe Thema hier jetzt mit 3 Sätzen umreiße und bei dir dann nur Bruchstücke des Ganzen ankommen,und du dadurch eventuell nen falschen Eindruck vom objektorientierten Paradigma bekommst,kann ich dir nur dazu raten dir ne wirklich gut Abhandlung über dieses Thema durchzulesen.
    Kannst ja mal bei google schauen.
    Ein wirklich sehr gutes Buch ,dass die OO-Thematik wirklich umfassend behandelt(aber leider auch ziemlich trocken geschrieben ist) ist "Objektorientierte Softwareentwicklung" von Bertrand Meyer.Erläutert die Konzepte allerdings anhand der Sprache Eiffel(von Bertrand Meyer erfunden :wink: ).

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)