OOP mit ANSI C



  • hier noch 'ne meinung zu 'smart pointers': http://yosefk.com/c++fqa/heap.html#fqa-16.22
    das deckt sich ungefähr mit meiner meinung.
    🙂



  • Smartpointer in C++ sind ein nützliches Idiom. Aber haben an und für sich nun einmal nichts mit OOP zu tun!

    Und in C ist es natürlich kein Problem alle möglichen OO Features nachzubauen. Objective-C ist zB nur ein Preprozessor für C und da geht es eher darum, die Syntax angenehmer zu machen, als fehlende Features einzubauen. Am Ende wird nämlich alles zu MOP Anweisungen, die _in_ reinem C sind runter kompiliert (wenn ich es richtig verstanden habe).

    Ein weiteres Beispiel für OO in C ist GTK+ und die GLIB (http://www.lore.ua.ac.be/Publications/pdf/Hendrickx2004.pdf).



  • -fricky- schrieb:

    hier noch 'ne meinung zu 'smart pointers': http://yosefk.com/c++fqa/heap.html#fqa-16.22
    das deckt sich ungefähr mit meiner meinung.
    🙂

    Okay das ist schön 🙂
    Aber eine Frage bleibt doch bist du jetzt eigentlich C, C++ oder Java/C# Programmierer/Nutzer ?



  • So nun nochmal zu deinem Link.
    Die Nachteile beziehen sich auf eigens geschriebene Smart pointer Klassen und welche Fallstricke Selbige aufweisen. Nur trifft dies auf die bereits entwickelten Smart pointer nicht mehr zu. Damit sind hauptsächlich die von Boost gemeint. Sie verhalten sich wie normale Zeiger und man hat immer die Möglichkeit an den rohen Zeiger ranzukommen wenn es sein muss(kompatibilität zu anderen Libs).



  • yet another 'is C OPP' Thread.... das wird langsam langweilig, haben wir nicht schon genug solche Threads hier im Forum?

    * http://www.c-plusplus.net/forum/viewtopic-var-t-is-217813-and-highlight-is-oop.html
    * http://www.c-plusplus.net/forum/viewtopic-var-t-is-209590-and-highlight-is-oop.html
    * http://www.c-plusplus.net/forum/viewtopic-var-t-is-187908-and-highlight-is-oop.html
    * usw, mind. 40 Treffer gefunden

    @nicht wirklich:
    Ich verstehe nicht, wieso immer manche Leute kommen, sich die Finger in den Ohren stecken und laut schreien 'lalalal, C ist nicht OOP egal wie viele gute Argumente ihr habt, lalala'. Guter Beweis 👍

    Hier und in den anderen Thraeds wirst du Beispiele für OOP in C finden, GTK+ ist das Paradebeispiel schlecht hin, sogar mit (für dich so hochgelobte und "notwendige" Bedingung) Vererbung von Klassen. Ich hab schon mit GTK bzw. Glib programmiert und weiß, dass es geht. Klassen zu schreiben und Vererbung zu schreiben ist nicht einfach und man kann mehr Fehler machen, als einem lieb ist, aber es ist nicht unmöglich. Leider hat C diesen syntaktischen Zucker wie C++ nicht, aber das heißt noch lange nicht, dass man in C keine OOP-Konzepte implementieren kann.

    Nicht wirklich schrieb:

    -fricky- schrieb:

    hier noch 'ne meinung zu 'smart pointers': http://yosefk.com/c++fqa/heap.html#fqa-16.22
    das deckt sich ungefähr mit meiner meinung.
    🙂

    Aber eine Frage bleibt doch bist du jetzt eigentlich C, C++ oder Java/C# Programmierer/Nutzer ?

    sollte eigentlich klar sein, oder? 😉



  • Nicht wirklich schrieb:

    -fricky- schrieb:

    hier noch 'ne meinung zu 'smart pointers': http://yosefk.com/c++fqa/heap.html#fqa-16.22
    das deckt sich ungefähr mit meiner meinung.
    🙂

    Okay das ist schön 🙂
    Aber eine Frage bleibt doch bist du jetzt eigentlich C, C++ oder Java/C# Programmierer/Nutzer ?

    Von dem was ich weiß: C im embedded bereich; und Java bei bedarf aufm desktop



  • Tachyon schrieb:

    -fricky- schrieb:

    [...]aber ich denke[...] 🙂

    Denke nicht. Schau es Dir lieber mal genau an.

    Ohne Vererbung keine OOP. Man kann bestenfalls objektbasiert programmieren. Das ist ein kleiner aber feiner Unterschied, der dem guten Shade aber leider nicht so recht einleuchten möchte.

    Ach faengt das wieder an. 🙄
    Dabei waere ich auch ueber Buchtippt fuer OOP in C dankbar.



  • Also mal ganz pragmatisch betrachtet - am Ende steht ein Binärcode, den irgendein Prozessor abrattelt, egal, ob jemand Lochkarten gestanzt hat oder ein in Java geschriebener Basic- Interpreter ein Script in einer JAR- Box abarbeitet. Das sieht die Maschine ja nicht.

    OOP ist eine Abstraktionsebene, die auf Klassen, Instanzen, Polymorphie, Datenkapselung usw. beruht und primär nicht zwischen Smart- oder Doofpointern unterscheidet, da führt die Diskussion echt vorbei. 👎

    Die Eingangsfrage war, ob C OOP kann, das ist zu bejahen, wenngleich eigentlich dafür gar nicht konzipiert. Einen handhabbaren Beweis dafür liefert Lightweight C++ http://freshmeat.net/projects/lwc , das C quasi als P-Code für C++ verwendet. Wenn man einige Dinge beachtet, kann man bedienungssicher nachvollziehen, wie man in C OOP nachbasteln kann. Da hat sich mittlerweile übrigens eine kleine Community gebildet mit Projekten drumrum. 😃

    Natürlich kann man sich auch seine eigene Lib schnitzen und ein bißchen "tun wie OOP", kommt drauf an, wie hoch die eigenen Ansprüche samt Sicherheitsbewußtsein sind 🙄



  • supertux schrieb:

    yet another 'is C OPP' Thread.... das wird langsam langweilig, haben wir nicht schon genug solche Threads hier im Forum?

    * http://www.c-plusplus.net/forum/viewtopic-var-t-is-217813-and-highlight-is-oop.html
    * http://www.c-plusplus.net/forum/viewtopic-var-t-is-209590-and-highlight-is-oop.html
    * http://www.c-plusplus.net/forum/viewtopic-var-t-is-187908-and-highlight-is-oop.html
    * usw, mind. 40 Treffer gefunden

    @nicht wirklich:
    Ich verstehe nicht, wieso immer manche Leute kommen, sich die Finger in den Ohren stecken und laut schreien 'lalalal, C ist nicht OOP egal wie viele gute Argumente ihr habt, lalala'. Guter Beweis 👍

    Hier und in den anderen Thraeds wirst du Beispiele für OOP in C finden, GTK+ ist das Paradebeispiel schlecht hin, sogar mit (für dich so hochgelobte und "notwendige" Bedingung) Vererbung von Klassen. Ich hab schon mit GTK bzw. Glib programmiert und weiß, dass es geht. Klassen zu schreiben und Vererbung zu schreiben ist nicht einfach und man kann mehr Fehler machen, als einem lieb ist, aber es ist nicht unmöglich. Leider hat C diesen syntaktischen Zucker wie C++ nicht, aber das heißt noch lange nicht, dass man in C keine OOP-Konzepte implementieren kann.

    Nicht wirklich schrieb:

    -fricky- schrieb:

    hier noch 'ne meinung zu 'smart pointers': http://yosefk.com/c++fqa/heap.html#fqa-16.22
    das deckt sich ungefähr mit meiner meinung.
    🙂

    Aber eine Frage bleibt doch bist du jetzt eigentlich C, C++ oder Java/C# Programmierer/Nutzer ?

    sollte eigentlich klar sein, oder? 😉

    Und welche guten Argumente wären das? Ich meine es ist doch wohl klar das C von Haus aus keine Möglichkeiten mitbringt Objektorientiert zu programmieren. Das einzige was möglich ist, wäre Objektbasierte programmierung wo man seine Structs hat und entsprechende freie Funktionen die dann damit arbeiten. So aber es gibt keine Kapselung oder Verebung. Natürlich kann man sich etwas Ähnliches zusammenbasteln was aber nur zu einem kleinen Teil funktioniert und sehr gefährlich sein kann. Bei den wirklich OO Sprachen hast du dieses Problem nicht, da sie eben alle Funktionalitäten die für die OOP nötig sind mitbringen. Da C dies aber in keiner Weise tut, ist es für mich auf keinen Fall OO. Ich denke letztendlich bringt die Diskussion die wir hier haben und schon öfters hatten nichts, da sich eh alles im Kreis dreht und wir uns nie auf etwas einigen können.



  • Nicht wirklich schrieb:

    Und welche guten Argumente wären das? Ich meine es ist doch wohl klar das C von Haus aus keine Möglichkeiten mitbringt Objektorientiert zu programmieren. Das einzige was möglich ist, wäre Objektbasierte programmierung wo man seine Structs hat und entsprechende freie Funktionen die dann damit arbeiten. So aber es gibt keine Kapselung oder Verebung. Natürlich kann man sich etwas Ähnliches zusammenbasteln was aber nur zu einem kleinen Teil funktioniert und sehr gefährlich sein kann. Bei den wirklich OO Sprachen hast du dieses Problem nicht, da sie eben alle Funktionalitäten die für die OOP nötig sind mitbringen. Da C dies aber in keiner Weise tut, ist es für mich auf keinen Fall OO. Ich denke letztendlich bringt die Diskussion die wir hier haben und schon öfters hatten nichts, da sich eh alles im Kreis dreht und wir uns nie auf etwas einigen können.

    Guckst Du hier: http://students.ceid.upatras.gr/~sxanth/lwc/Examples.html



  • Nicht wirklich schrieb:

    Und welche guten Argumente wären das? Ich meine es ist doch wohl klar das C von Haus aus keine Möglichkeiten mitbringt Objektorientiert zu programmieren. Das einzige was möglich ist, wäre Objektbasierte programmierung wo man seine Structs hat und entsprechende freie Funktionen die dann damit arbeiten. So aber es gibt keine Kapselung oder Verebung. Natürlich kann man sich etwas Ähnliches zusammenbasteln was aber nur zu einem kleinen Teil funktioniert und sehr gefährlich sein kann. Bei den wirklich OO Sprachen hast du dieses Problem nicht, da sie eben alle Funktionalitäten die für die OOP nötig sind mitbringen. Da C dies aber in keiner Weise tut, ist es für mich auf keinen Fall OO. Ich denke letztendlich bringt die Diskussion die wir hier haben und schon öfters hatten nichts, da sich eh alles im Kreis dreht und wir uns nie auf etwas einigen können.

    genau das, was du da schreibst, sagen andere in den anderen Thraeds, die ich gepostet habe. Und dort wurden all diese Sachen widerlegt. Ich hab weder Zeit noch Lust die Antworten der unzähligen Threads zu suchen, schneiden, hier posten. Lies einfach die anderen Threads.

    - C hat keinen Syntaktischen Zucker, um schnell und bequem OPP zu programmieren. Aber OPP ist nicht die Sprache sondern das Konzept (feiner aber großer Unterschied)

    - Datenkapselung hast du tatsächlich in C, dafür sind structs da. Mit structs kannst du Daten kapseln, wo ist das Problem? Ich weiß, du wirst darauf kommen "in C Structs gibt es keine private Member und jeder kann darauf zugreifen. In C++ oder Java ist das nicht möglich", oder? GTK+ demonstriert wie sowas in C geht und in einem der Threads oben gibt es ein schönes beispiel, welches zeigt, wie man in C++ auf private Member einer Klasse zugreifen kann. Also kann ich dieses "C hat keine Datenkapselung wie C++/Java" Argument nicht gelten lassen, weil es einfach falsch ist.

    - Die FILE Struktur von stdio.h ist ein schönes Bsp für OPP: fopen ist Konstruktor, fclose ist Destruktur, fread/fwrite sind Setter/getter. Vererbung?

    typedef better__FILE {
      FILE *f;
      /* weitere member */
    } BetterFile;
    

    nicht so schick wie in C++, aber es ist eine Art von Vererbung. Schreibt man sich gute Wrapper, dann kann man fopen mit einem BetterFile Objet aufrufen. Beispiele dafür bietet GTK an.

    Da C dies aber in keiner Weise tut, ist es für mich auf keinen Fall OO

    du hast nur ein zu eingeschränktes Weltbild. C hat keinen syntaktsichen Zucker, das streitet keiner hier ab, aber du kannst trotdezm die Konzepte der OOP implementieren. Es ist schwieriger, fehleranfälliger. *Das* streitet keiner ab, aber es geht. Ein Fahrrad ist nicht dazu da um Fussball zu spielen, jedoch gibt es manche Verrückte, die das trotzdem schaffen, obwohl Fahrräder nicht zum Fussballspielen entwickelt worden sind. Hier ist es dasselbe.



  • pointercrash() schrieb:

    Nicht wirklich schrieb:

    Und welche guten Argumente wären das? Ich meine es ist doch wohl klar das C von Haus aus keine Möglichkeiten mitbringt Objektorientiert zu programmieren. Das einzige was möglich ist, wäre Objektbasierte programmierung wo man seine Structs hat und entsprechende freie Funktionen die dann damit arbeiten. So aber es gibt keine Kapselung oder Verebung. Natürlich kann man sich etwas Ähnliches zusammenbasteln was aber nur zu einem kleinen Teil funktioniert und sehr gefährlich sein kann. Bei den wirklich OO Sprachen hast du dieses Problem nicht, da sie eben alle Funktionalitäten die für die OOP nötig sind mitbringen. Da C dies aber in keiner Weise tut, ist es für mich auf keinen Fall OO. Ich denke letztendlich bringt die Diskussion die wir hier haben und schon öfters hatten nichts, da sich eh alles im Kreis dreht und wir uns nie auf etwas einigen können.

    Guckst Du hier: http://students.ceid.upatras.gr/~sxanth/lwc/Examples.html

    Das Teil baut aus OOP-Sprachen-Code prozeduralen Code. Und? Was hat der Output noch mit OOP zu tun?



  • @Taychon:

    http://students.ceid.upatras.gr/~sxanth/lwc/ schrieb:

    Important thing about lightweight C++ is that by studying the generated C code it is easy to understand how OOP features are implemented and what is the cost of everything.



  • Tachyon schrieb:

    Ohne Vererbung keine OOP. Man kann bestenfalls objektbasiert programmieren. Das ist ein kleiner aber feiner Unterschied, der dem guten Shade aber leider nicht so recht einleuchten möchte.

    Genau deshalb finde ich solche Diskussionen so ermüdend.
    Vererbung ist ein Konzept das Klassen braucht. Wozu brauch ich Klassen in der OOP? Wovon du hier sprichst ist Java. Schlicht und ergreifend Java.

    Ja, Java bietet eine Menge objekt orienitierter Konzepte von haus aus, darunter auch etwas dass ein bisschen wie Vererbung aussieht - aber eigentlich keine wirklich echte Vererbung ist. Aber darüber will ich jetzt eigentlich nicht reden.

    Was ich sagen will: schau dir einmal Sprachen ohne Klassen an. zB JavaScript. JavaScript ist eine Objektorinitierte Sprache die keine Klassen kennt. Sie kennt dafür Prototypen. Und Prototypen kann man nicht vererben.

    Aber das ist eben ein guter Filter um zu erkennen ob es Wert ist mit jemanden über das Thema OOP zu diskutieren. Es gibt wahnsinnig viele interessante Sachen über die ich gerne auch mal mit mehr Leuten reden würde - aber leider kommen wir hier ja nie weit genug.

    Deshalb ist mittlerweile meine Standardfrage wenn ich einen programmierer einschätzen will ob er denkt dass er in Sprache XY objektorientierten Code schreiben kann - das ist wie mit der frage nach UML.

    Es offenbart sich dann idR recht schnell ob man mit demjenigen arbeiten kann oder nicht.

    Java ist schön und gut, aber Java bietet einen Tunnelblick auf viele Konzepte (jede Sprache tut das, da nie alle Konzepte perfekt unterstützt werden können). Nur sollte man sich dessen immer bewusst sein.

    Lustigerweise waren sich die Leute die die guten C APIs implementiert haben vermutlich nicht der OOP wirklich bewusst die sie eingesetzt haben, woran man zB sehr schön erkennt dass man ein Konzept nicht zwangsläufig kennen und benennen muss bevor man es implementieren kann...



  • Um mal auf das Originalthema zurückzukommen, der OT fragte ob es problemlos möglich sei OOP in C zu verwenden. Ich verneinte das, mit der Begründung das die Sprache kein OO unterstützt, ich konnte auch nichts im Typsystem von C entdecken dass die Annahme C sei für OO ausgelegt bekräftigt, C ist für mich keine OO Sprache. Desweiteren impliziert problemlose Unterstützung für mich das die Sprache dementsprechende OO Konstrukte zur Verfügung stellt und ich eben nicht alles selbst machen muss.

    Das man alles selbst machen kann bestreitet niemand und auch nicht das man einen Strukturbruch von OO in Richtung prodzedural herbeiführen kann, die Frage ist ob es den Aufwand rechtfertigt oder ob man nicht gleich zu einer Sprache greifen sollte die dementsprechende Konstrukte unterstützt.



  • Shade Of Mine schrieb:

    Java [bietet] auch etwas dass ein bisschen wie Vererbung aussieht - aber eigentlich keine wirklich echte Vererbung ist. Aber darüber will ich jetzt eigentlich nicht reden.

    schade. auf die begründung wäre ich echt gespannt.
    🙂



  • TheTester schrieb:

    Um mal auf das Originalthema zurückzukommen, der OT fragte ob es problemlos möglich sei OOP in C zu verwenden. Ich verneinte das, mit der Begründung das die Sprache kein OO unterstützt, ich konnte auch nichts im Typsystem von C entdecken dass die Annahme C sei für OO ausgelegt bekräftigt, C ist für mich keine OO Sprache. Desweiteren impliziert problemlose Unterstützung für mich das die Sprache dementsprechende OO Konstrukte zur Verfügung stellt und ich eben nicht alles selbst machen muss.

    die Frage war auch nicht "wie einfach OPP in C" oder "rechtfertigt sich OPP in C", sondern ob es möglich ist. Und diese Frage, ob's möglich ist, muss man mit 'Ja' beantworten. Die anderen Fragen kannst du ruhig mit nein beantworten, es gibt sicherlich mehr Argumente, die dagegen sprechen. Aber in erster Linie (sorry, es klingt hart, aber es ist nicht so gemeint noch ein Angriff auf dich) interessiert bei der Fragestelltung deine Meinung gar nicht (du schreibst ja auch "für mich"), weil der OP nicht nach deiner Meinung gefragt hat.

    TheTester schrieb:

    Das man alles selbst machen kann bestreitet niemand und auch nicht das man einen Strukturbruch von OO in Richtung prodzedural herbeiführen kann

    und das rechtfertigt unsere "Ja"-Antwort. Weil es einfach möglich ist.

    TheTester schrieb:

    die Frage ist ob es den Aufwand rechtfertigt oder ob man nicht gleich zu einer Sprache greifen sollte die dementsprechende Konstrukte unterstützt.

    diese Frage wurde aber hier nicht gestellt, also ist in diesem Sinne deine Meinung dazu nicht von belang. Es wurde nicht gefragt ob es Sinn macht oder ob der Aufwand rechtfertigt werden kann. Du hast eine objektive Frage mit einer subjektiven Antwort geantwortet.



  • supertux schrieb:

    die Frage war auch nicht "wie einfach OPP in C" oder "rechtfertigt sich OPP in C", sondern ob es möglich ist.[...]

    Die Frage war ob es "problemlos" möglich sei, Synonyme für problemlos sind, leicht, mühelos, unkompliziert, ohne weiteres. Und ist es das? Nein, man muss viel Code schreiben um realativ gesehen wenig zu erreichen, das ist weder mühelos, noch unkompliziert oder etwas anderes. Oder schüttelst du z.B. sauber implementiere dynamische Polymorphie in C einfach so aus dem Ärmel? Und um dir noch etwas Genugtuung zu geben, ja man kann OO in C verwirklichen aber ein Nein zum problemlos.



  • TheTester schrieb:

    supertux schrieb:

    die Frage war auch nicht "wie einfach OPP in C" oder "rechtfertigt sich OPP in C", sondern ob es möglich ist.[...]

    Die Frage war ob es "problemlos" möglich sei, Synonyme für problemlos sind, leicht, mühelos, unkompliziert, ohne weiteres. Und ist es das? Nein, man muss viel Code schreiben um realativ gesehen wenig zu erreichen, das ist weder mühelos, noch unkompliziert oder etwas anderes. Oder schüttelst du z.B. sauber implementiere dynamische Polymorphie in C einfach so aus dem Ärmel? Und um dir noch etwas Genugtuung zu geben, ja man kann OO in C verwirklichen aber ein Nein zum problemlos.

    Dem kann ich mich so nur anschließen und um nocheinmal einen kleinen Vergleich zu bemühen: Man kann auch einen Schraubendreher benutzen, um Nägel ind ie Wand zu schlagen, wie gesagt man kann. Oder man benutzt einfach einen Hammer der darauf ausgelegt ist, für diese Aufgabe benutzt zu werden.



  • Shade Of Mine schrieb:

    ...dies und das ist kein OOP...

    Such dir mal eine beliebige Beispielaufgabe aus und zeige wie du sie in C einmal einach nur prozedural ohne OOP löst und wie du sie in C mit OOP löst. Und erklär dann daran was die entscheidenden Unterschiede zwischen OOP und nicht OOP ausmacht.


Anmelden zum Antworten