[Anfängerfrage] c und oop



  • Hallo c/c++-community,

    (Mir ist absolut bewusst, dass c und objektorientierte Programmierung durchaus ein Streitthema sein kann. Dies ist nicht Hintergrund meiner Frage und soll hier auch bitte nicht weiter diskutiert werden, da mir dies bei meinem Problem nicht weiter hilft. Ich habe deswegen im weiteren das Objektorienterte in Gänsefüßchen gesetzt!)

    ich habe heute mal eine Frage zur "Objektorientierten" Programmierung mit Ansi-C. Also ich habe mir mal ein paar Beiträge (z.B. http://hitforum.de/oo-entz.pdf und http://www.mathematik.uni-ulm.de/sai/ws96/seminar/neher/node9.html) zum Thema herausgesucht und arbeite diese gerade durch. Hier stehe ich aber seit geraumer Zeit ein wenig auf dem Schlauch.

    Erstmal kurz an welchem Punkt ich bin:
    Also mir ist klar, dass die Klassen in C als Structs definiert werden, welche bestimmte Funktionen (Konstruktoren, Destruktoren, ...) unter bestimmten Konventionen beinhalten, damit ich eine allgemeingültige Funktion void *new() declarieren kann, mit der ich alle Objekte instanziere.

    In der Quelle http://www.mathematik.uni-ulm.de/sai/ws96/seminar/neher/node9.html ist nun in der void *new()-Funktion folgender Aufruf, den ich nicht verstehe:

    if ( class -> constructor )   // Was bedeutet diese Zeile?
            {
              if (argnr>0)
                 /* Die variable Argumentliste fuer den Konstruktor
          	  erzeugen */
               {
                va_list  ap;
                va_start(ap, argnr);
                p = class -> constructor (p,argnr, &ap);
                va_end(ap);
              }
              else
                 /* Der Konstruktor bekommt keine Argumente
          	  fuer Initialisierung */
              {
                p = class -> constructor (p, 0, 0);
              }
            }
            else
               /* jede Klasse muss ueber einen Default-Konstruktor
          	      verfuegen! */
            {
               fatalerror("no constructor found\n",1);
            }
    

    Ich habe mal die Zeile gekennzeichnet, die ich nicht wirklich verstehe. der Konstruktor hat gemäß Konvention folgenden Aufbau:

    struct CLASS {
            size_t size;
            void * (*constructor) (void * _self , const int argnr,\
                                   va_list * _ap);
            void * (*destructor)  (void * _self);
            void * (*copy)        (const void * _self);
            void   (*cout)        (const void * _self);
          };
    

    Er liefert also keinerlei boolschen Wert zurück. Zielt die If-Abfrage darauf ab, ob in der Klasse ein Konstruktor definiert wurden und wenn dies der Fall ist, soll er genutzt werden oder wie ist das zu verstehen?

    Mit freundlichem Gruß

    mirrowwinger



  • mirrowwinger schrieb:

    Zielt die If-Abfrage darauf ab, ob in der Klasse ein Konstruktor definiert wurden und wenn dies der Fall ist, soll er genutzt werden oder wie ist das zu verstehen?

    Ja, die Abfrage ist äquivalent zu if(class -> constructor != NULL) . Wichtig ist natürlich, dass die Struktur auch vorher initialisiert wurde. Also beispielsweise komplett mit 0-Bytes gefüllt.



  • Vielen Dank für die schnelle Antwort.

    mirrowwinger



  • Ja das ist durchaus ein interessantes Thema.
    Ich habe die konkrete Implementierung von <constructor> nicht gefunden, nehme aber an, dass ein Zeiger auf das instanziierte "Objekt" der "Klasse" zurückgegeben wird, falls dies fehlschlug, wird NULL geliefert was geprüft wird.

    Außerdem vorsichtig mit den o.g. Quellen, der eine Herr z.B. behauptet:

    Strukturen A und B mit den gleichen, in der gleichen Reihenfolge
    deklarierten, Elementtypen sind zueinander kompatibel.

    Das ist natürlich Unsinn.

    typedef struct {int a,b;} A;
    typedef struct {int a,b;} B;
    

    Hier ist es eben nicht garantiert, dass diese beiden Typen zueinander "kompatibel" sind (was soll dass überhaupt heißen "kompatibel"? verlustfrei zuweisbar?). Der Compiler kann padding-Bytes einstreuen wie er will und den diesbezüglich einzig gangbaren Weg über offsetof zeigt der Herr nicht. (wahrscheinlich weil er ihn nicht kennt)

    Du brauchst aber nicht in die Ferne schweifen, hier gibts auch was zu deinem Thema zu finden:
    http://www.c-plusplus.net/forum/p2097958#2097958
    http://www.c-plusplus.net/forum/p2061196#2061196
    Hierbei wird auch gezeigt, wie man auf die "Instanziierung" des "Objekts" verzichten kann.

    Auch gab es mal bei codeproject (voriges Jahr?) einen indischen Herrn, der mit ANSI C OOP präsentieren wollte, habe ich aber dann nicht weitergelesen, als ich "void main()" sah.



  • @Wutz vielen Dank deine Links helfen mir echt weiter. Habe auch (weil ich als Maschinenbauer dies eh nicht wissen kann) einen Entsprechenden Hinweis ganz am Anfang meines Beitrages hinterlassen.


Log in to reply