Verwendbarkeit von OOP bzw. Polymorphismus aus C++ in C



  • Huhu,

    aus Interesse und Neugierde hab ich mal ein wenig im Internet gestöbert in wie weit und ob es möglich ist, Polymorhpismus auch in C umsetzen zu können. Dabei bin ich auf folgendes Beispiel einer Umsetzungsmöglichkeit gestoßen:

    #include <stdio.h>
    
    typedef struct
    {
        int (*get)(void* this);
        void (*set)(void* this, int i);
        int member;
    
    } TheClass;
    
    int Get(void* this)
    {
        TheClass* This = (TheClass*)this;
        return This->member;
    }
    
    void Set(void* this, int i)
    {
        TheClass* This = (TheClass*)this;
        This->member = i;
    }
    
    void init(TheClass* this)
    {
        this->get = &Get;
        this->set = &Set;
    }
    
    int main(int argc, char **argv)
    {
        TheClass name;
        init(&name);
        (name.set)(&name, 10);
        printf("%d\n", (name.get)(&name));
        return 0;
    }
    

    Quelle: http://stackoverflow.com/questions/524033/how-can-i-simulate-oo-style-polymorphism-in-c

    TheClass wäre an dieser Stelle die Klasse mit dem Attribut member und den Eigenschaften, welche innerhalb von VTable definiert sind.
    Mir stellt sich jetzt nur die Frage der Sinnhaftigkeit solcher Konstrukte in C. Selbst wenn ich Daten verbergen möchte, so komme ich doch über einen Pointer auf mein Struct immer wieder an die Attribute heran und kann diese verändern. Wenn ich das richtig sehe, sind nur die Funtionen verborgen und werden erst nach der Initialisierung zur Verfügung gestellt.

    Als Abschließende Frage noch: Wann setze ich sowas konkret ein bzw. wann lohnt es sich solche Konstrukte einzusetzen gegenüber einer einfachen struct- und normalen Funktions-Definitionen, mit denen das struct einfacher bearbeitet werden kann.



  • Nirvash schrieb:

    Huhu,

    hi bruder!

    Nirvash schrieb:

    aus Interesse und Neugierde hab ich mal ein wenig im Internet gestöbert in wie weit und ob es möglich ist, Polymorhpismus auch in C umsetzen zu können.

    das ist in c nicht möglich.

    Nirvash schrieb:

    Dabei bin ich auf folgendes Beispiel einer Umsetzungsmöglichkeit gestoßen:

    das ist keine polymorphie.

    Nirvash schrieb:

    Mir stellt sich jetzt nur die Frage der Sinnhaftigkeit solcher Konstrukte in C.

    falls man den zeigern funktionen dynamisch zur laufzeit verändern möchte, kann man das so machen. meistens ist dies nicht nötig und man kann es sich einfacher machen:

    Nirvash schrieb:

    Selbst wenn ich Daten verbergen möchte, so komme ich doch über einen Pointer auf mein Struct immer wieder an die Attribute heran und kann diese verändern.

    nein. es gibt die möglichkeit daten static zu deklarieren und funktionen zu schreiben, die mit diesen daten arbeiten.
    eine veränderung ist dann ausschließlich nur mit diesen funktionen möglich.

    gruß,
    b.b.



  • big bruderherz schrieb:

    Nirvash schrieb:

    Selbst wenn ich Daten verbergen möchte, so komme ich doch über einen Pointer auf mein Struct immer wieder an die Attribute heran und kann diese verändern.

    nein. es gibt die möglichkeit daten static zu deklarieren und funktionen zu schreiben, die mit diesen daten arbeiten.
    eine veränderung ist dann ausschließlich nur mit diesen funktionen möglich.

    Ein Beispiel dazu findet sich hier.


  • Mod

    big bruderherz schrieb:

    Nirvash schrieb:

    Huhu,

    hi bruder!

    Nirvash schrieb:

    aus Interesse und Neugierde hab ich mal ein wenig im Internet gestöbert in wie weit und ob es möglich ist, Polymorhpismus auch in C umsetzen zu können.

    das ist in c nicht möglich.

    Natürlich ist das möglich. Es ist nur nicht schön. Es gibt C++ zu C Compiler. Selbst Exceptions kannst du in C umsetzen (mit reinem Standard-C aber nicht so schön, wie manche Implementierungen das in C++ machen, indem sie die Eigenschaften der Plattform ausnutzen).

    Hier musst du dir halt einen vtable oder etwas vergleichbares nachprogrammieren.



  • SeppJ schrieb:

    big bruderherz schrieb:

    Nirvash schrieb:

    Huhu,

    hi bruder!

    Nirvash schrieb:

    aus Interesse und Neugierde hab ich mal ein wenig im Internet gestöbert in wie weit und ob es möglich ist, Polymorhpismus auch in C umsetzen zu können.

    das ist in c nicht möglich.

    Natürlich ist das möglich. Es ist nur nicht schön. Es gibt C++ zu C Compiler. Selbst Exceptions kannst du in C umsetzen (mit reinem Standard-C aber nicht so schön, wie manche Implementierungen das in C++ machen, indem sie die Eigenschaften der Plattform ausnutzen).

    Hier musst du dir halt einen vtable oder etwas vergleichbares nachprogrammieren.

    unter polymorphie versteht man unter anderem funktionen mit gleichem namen und verschiedenen rückabewerten oder parameterlisten. das kompiliert kein c compiler, das ist mit c nicht machbar.

    gruß,
    b.b.



  • Er meint aber Subtyppolymorphismus. Es ist für OOP nicht notwendig irgendwelche anderen Polymorphiekonzepte umzusetzen. Schon gar nicht Überladung, was die meisten nichtmal Polymorphie nennen würden.



  • #include <stdio.h> 
    #include <stdlib.h>
    
    typedef struct 
    { 
    	void (*message)();
    } myInterface; 
    
    void MyType1_message()
    {
    	printf("MyType1 Msg\n");
    }
    
    myInterface* MyType1_new()
    {
    	myInterface* obj = (myInterface*)malloc(sizeof(myInterface));
    	obj->message = MyType1_message;
    	return obj;
    }
    
    void MyType1_delete(myInterface* obj)
    {
    	free(obj);
    }
    
    void MyType2_message()
    {
    	printf("MyType2 Msg\n");
    }
    
    myInterface* MyType2_new()
    {
    	myInterface* obj = (myInterface*)malloc(sizeof(myInterface));
    	obj->message = MyType2_message;
    	return obj;
    }
    
    void MyType2_delete(myInterface* obj)
    {
    	free(obj);
    }
    
    int main(int argc, char **argv) 
    { 
    	myInterface* obj1 = MyType1_new();
    	myInterface* obj2 = MyType2_new();
            // Ist doch wunderschönes OOP :D Gleiche Namen
    	(*obj1).message();
    	(*obj2).message();
    	MyType1_delete(obj1);
    	MyType2_delete(obj2);
        return 0; 
    }
    


  • Youka schrieb:

    big bruderherz schrieb:

    Nirvash schrieb:

    Selbst wenn ich Daten verbergen möchte, so komme ich doch über einen Pointer auf mein Struct immer wieder an die Attribute heran und kann diese verändern.

    nein. es gibt die möglichkeit daten static zu deklarieren und funktionen zu schreiben, die mit diesen daten arbeiten.
    eine veränderung ist dann ausschließlich nur mit diesen funktionen möglich.

    Ein Beispiel dazu findet sich hier.

    Vielen Dank für das Beispiel. So etwas habe ich versucht zu finden und mcih daher mit Polymorphismus befasst. Mir war nur nicht ganz klar wo ich in .h und .c Datei die struct und typedef Definitionen dann hinpacke.


Anmelden zum Antworten