
Simple Frage:
Wie programmiert man "objektorientiert" in C?
MfG
Daniel
Code: Alles auswählen
struct Base
{
int id;
int BaseValue;
};
struct DerivedA
{
struct Base myBase;
int ValueA;
};
struct DerivedB
{
struct Base myBase;
int ValueB;
};
Code: Alles auswählen
void MethodForA( struct DerivedA * this, int parameter );
Code: Alles auswählen
void MethodForBase( struct Base * this, int parameter );
Code: Alles auswählen
void MethodForBase( struct Base * this, int parameter )
{
switch( this->id )
{
case 1: /* I am a DerivedA */ break;
case 2: /* I am a DerivedB */ break;
default: /* I am abstract */ break;
}
}
Code: Alles auswählen
struct DataTypeDescription
{
char const * ObjectTypeName;
}
struct VTable_Base
{
struct DataTypeDescription base;
void (*MethodForBase)( struct Base * this, int parameter );
};
struct Base
{
struct VTable_Base * vTable;
int BaseValue;
};
struct DerivedA
{
struct Base * myBase;
int ValueA;
};
struct DerivedA_VTable
{
struct DataTypeDescription base;
void (*MethodForBase)( struct Base * this, int parameter );
void (*MethodForA)( struct DerivedA * this, int parameter );
}
struct DerivedB
{
struct Base * myBase;
int ValueB;
};
struct DerivedB_VTable
{
struct DataTypeDescription base;
void (*MethodForBase)( struct Base * this, int parameter );
void (*MethodForB)( struct DerivedA * this, int parameter );
}
Code: Alles auswählen
void func( struct Base * b, int parameter )
{
/* Aufruf der virtuellen Methode 'MethodForBase'
b->vTable->MethodForBase( b, parameter );
}
Code: Alles auswählen
int add( int a, int b ) { return a+b; }
int mul( int a, int b ) { return a*b; }
struct Operator
{
int a, b;
int (*operation)(int a, int b);
}
int doOperation( struct Operator * op )
{
return op->operation( op->a, op->b );
}
int main(void)
{
Operator opA, opB;
opA = new Operator();
opA->a = 1;
opA->b = 2;
opA->operation = add;
opB = new Operator();
opB->a = 1;
opB->b = 2;
opB->operation = mul;
}
In der Regel nicht - wie gesagt - es gibt keine Vorschrift, wie man OOP implementiert, aber eine bessere Variante ist mir nicht bekannt.Dirty Oerti hat geschrieben:Danke
*Sich das jetzt noch ein paar mal durchles, um sicher zu sein, alles verstanden zu haben*
Hauptsächlich hab ich das zur Beantwortung einer Frage (Unterschied C <-> C++) gebraucht. Interessant ist es aber
Im Prinzip wird aus dem C++ Code ja damit auch nichts anderes generiert als aus diesem (doch etwas umfangreicheren) C Code, oder?
Heftig... wenn das so bleibt, werden wir auf kurz oder lang umziehen. :-/Dirty Oerti hat geschrieben:*edit* Ein Nachtrag.... das Absenden DIESES Beitrags dauerte ca 30 Sekunden.... ?! */edit*
Es ist praxistauglich, es wird auch verwendet, aber C++ ist angenehmer.cloidnerux hat geschrieben:Sieht nach einer netten Spielerei aus,
aber für Praxistauglich halte ich das nicht.
Natürlich, man muss sich den Konstruktur nur selbst schreiben.cloidnerux hat geschrieben:So wie es aussieht, hat man keine möglichkeit dynamisch Objekte zu erzeugen und wieder zu löschen.
Vererbung habe ich beschrieben, Überladungen sind für OOP nicht erforderlich und Namensräume werden durch Prefixe "emuliert".cloidnerux hat geschrieben:Auch Dinge wie Überladungen, Vererbung und Namensräume, die man von C++ gewohnt ist, sind unter dieser C Alternative nicht vorhanden.
Natürlich, da ist vieles eingeflossen, was man durch die Programmierung von ältern Sprachen gelernt hat. Eben eine Weiterentwicklung.cloidnerux hat geschrieben:Wenn man das sieht, dann ist mir auch bewusst, warum man C++ so ist wie es heute ist.