Programiersprache für Anfänger



  • DEvent schrieb:

    Ausserdem, aus mehreren Gruenden, die ich bestimmt nicht nochmal erleutere, kann man in C viel einfacher und sauberer OO programmieren als in C++.

    Dann gib mal bitte ein Link darauf, wo du das schonmal erläutert hast. Dass du in C OOP betreiben kannst, stimmt schon nur für sehr eingeschränkte Vorstellungen von OOP, aber dass das dann sauber ist, kann ich mir gar nicht vorstellen.



  • DEvent schrieb:

    Ausserdem, aus mehreren Gruenden, die ich bestimmt nicht nochmal erleutere, kann man in C viel einfacher und sauberer OO programmieren als in C++.

    es hat hier auch mal einer erzählt (übrigens, ein user mit einer 5-stelligen beitragszahl), dass Java kein 'richtiges' OOP unterstützt, auch mit dem hinweis, dass er auf fragen diesbezüglich nicht antworten wird. ich bin wahrlich kein freund von C++, aber dass man in C einfacher OO-programmieren kann, als in C++, halte ich für ein gerücht.
    🙂



  • Hi,

    was spricht eigentlich gegen Delphi als Anfängersprache? Ist doch um einiges einfacher als C++ und ähnliche und wenn man damit klar kommt ists mit C++ auch keine große Hürde mehr. Der Vorteil gegenüber C# und Java ist, daß Delphi eine sich wesentlich mehr von C++ unterschiedende Syntax hat und daher weniger zu verwechslungen beim Umstieg führt.

    Gruß Mümmel



  • Bashar schrieb:

    DEvent schrieb:

    Ausserdem, aus mehreren Gruenden, die ich bestimmt nicht nochmal erleutere, kann man in C viel einfacher und sauberer OO programmieren als in C++.

    Dann gib mal bitte ein Link darauf, wo du das schonmal erläutert hast. Dass du in C OOP betreiben kannst, stimmt schon nur für sehr eingeschränkte Vorstellungen von OOP, aber dass das dann sauber ist, kann ich mir gar nicht vorstellen.

    Bitte:
    http://www.mathematik.uni-ulm.de/sai/ws96/seminar/neher/
    http://home.comcast.net/~fbui/OOC.html

    Ein Beispiel, wo man ein Feature von OOP sauberer in C programmieren kann als in C++: Kapselung.
    In C schreibe ich die oeffentliche Schnittstelle so:

    extern const void *STRING;
    
    void *createString();
    void deleteString(void* self);
    void* copyString(void* self);
    char* getString(void* self);
    void setString(void* self, char* str);
    

    In C++ sieht das so aus:

    class String {
        public:
            String();
            ~String();
            String copyString();
            char* getString();
            void setString(char* str);
    // man koennte denken, dass dies genuegen wuerde, aber nein
        protected:
    // viele schoene protected Methoden
        private:
    // noch mehr Hilfs-Methoden, die im Interface ueberhaupt nichts verloren haben
    }
    

    Im Gegensatz zu dem Beispiel mit C ist das oeffentliche Interface "beschmutzt" durch private Methoden und Attribute. Das hat zur Folge, dass der C++ Compiler dir zwar eine Fehlermeldung ausgibt, wenn du versuchst auf diese zuzugreifen, aber du musst trotzdem jedesmal dein gesammtes Programm neu uebersetzen, wenn du irgendwas an den nicht oeffentlichen Teil veraenderst. Ein stabiles oeffentliches Interface muss man sich in C++ durch abstrakte Klassen erkaufen, was virtuelle Methoden erzwingt.



  • DEvent schrieb:

    Im Gegensatz zu dem Beispiel mit C ist das oeffentliche Interface "beschmutzt" durch private Methoden und Attribute. Das hat zur Folge, dass der C++ Compiler dir zwar eine Fehlermeldung ausgibt, wenn du versuchst auf diese zuzugreifen, aber du musst trotzdem jedesmal dein gesammtes Programm neu uebersetzen, wenn du irgendwas an den nicht oeffentlichen Teil veraenderst. Ein stabiles oeffentliches Interface muss man sich in C++ durch abstrakte Klassen erkaufen, was virtuelle Methoden erzwingt.

    Schon mal was von Pimpl gehört?



  • DEvent schrieb:

    Im Gegensatz zu dem Beispiel mit C ist das oeffentliche Interface "beschmutzt" durch private Methoden und Attribute.

    Das stört mich auch seit langem 😞 (Heißt aber nicht, dass ich "OOC" besser finde :))

    edit @tntnet: Pimpl ist aber auch nicht ohne Aufwand und Einbußen zu haben.





  • DEvent schrieb:

    Im Gegensatz zu dem Beispiel mit C ist das oeffentliche Interface "beschmutzt" durch private Methoden und Attribute.

    Dafür ist es in C dadurch beschmutzt, das jeder nach belieben auf deinen String zugreifen kann. Und davon abgesehen hat jeder bei C++ die Möglichkeit Funktionen im Anonymen Namensraum in der Sourcedatei zu deklarieren.

    Und ansonsten Verweise auch ich auf das Handle-Body Idiom, alias Pimpl.



  • asc schrieb:

    Und ansonsten Verweise auch ich auf das Handle-Body Idiom, alias Pimpl.

    Wenigstens die letzten 3 Posts kann man sich ja noch durchlesen 😉



  • DEvent schrieb:

    In C++ sieht das so aus:

    class String {
        public:
            String();
            ~String();
            String copyString();
            char* getString();
            void setString(char* str);
    // man koennte denken, dass dies genuegen wuerde, aber nein
        protected:
    // viele schoene protected Methoden
        private:
    // noch mehr Hilfs-Methoden, die im Interface ueberhaupt nichts verloren haben
    }
    

    ^^ spontan fallen mir zwei möglichkeiten ein, um das zu umgehen:
    1. mach dir ne basisklasse mit den hilfsfunktionen. dann sieht man zwar noch, dass die klasse erbt, aber nicht die funktionen selber.
    2. freie funktionen mit nem 'static' davor, die man dann aber mit einem 'this' versorgen muss. dann sieht man garnix mehr von den hilfsfunktionen.
    🙂



  • ~fricky schrieb:

    2. freie funktionen mit nem 'static' davor, die man dann aber mit einem 'this' versorgen muss. dann sieht man garnix mehr von den hilfsfunktionen.

    Ist aber wertlos, weil du ja keinen Zugriff auf die privaten Variablen hast.



  • asc schrieb:

    Dafür ist es in C dadurch beschmutzt, das jeder nach belieben auf deinen String zugreifen kann.

    Wenn das ein Problem darstellt, dann wird es nicht durch die geschickte Wahl einer Programmiersprache gelöst.



  • Ist aber wertlos, weil du ja keinen Zugriff auf die privaten Variablen hast.

    die man dann aber mit einem 'this' versorgen muss

    :xmas1:



  • DEvent schrieb:

    Ein Beispiel, wo man ein Feature von OOP sauberer in C programmieren kann als in C++: Kapselung.

    Das ist eher nicht gerade das prominenteste Beispiel für ein OO-Feature. Was tust du in Sachen Typsicherheit? Im übrigen meinte ich einen Link auf die Argumente, die du schonmal gebracht hast und "nicht nochmal erläutern" wolltest. Irgendwelche Quellen über OO in C raussuchen kann ich auch, aber ich habe keine Lust, mir daraus deine Meinung zusammenzudestillieren.

    In C schreibe ich die oeffentliche Schnittstelle so:

    extern const void *STRING;
    
    void *createString();
    void deleteString(void* self);
    void* copyString(void* self);
    char* getString(void* self);
    void setString(void* self, char* str);
    

    Alles mit void*. Wahnsinnig sauber.



  • Bashar schrieb:

    Alles mit void*. Wahnsinnig sauber.

    der void* transportiert doch nur ein 'handle'. die funktionen können natürlich erkennen, ob sie ein gültiges string-handle bekommen haben. ausserdem gehört typsicherheit nicht zwingend zu OOP dazu.
    🙂



  • sothis_ schrieb:

    Ist aber wertlos, weil du ja keinen Zugriff auf die privaten Variablen hast.

    die man dann aber mit einem 'this' versorgen muss

    :xmas1:

    Der Zeiger bringt dir doch nix, weil du keinen Zugriff aus der freien (also nicht-Member-) Funktion auf private Member-Variablen hast.



  • Badestrand schrieb:

    Der Zeiger bringt dir doch nix, weil du keinen Zugriff aus der freien (also nicht-Member-) Funktion auf private Member-Variablen hast.

    c++ kennt doch diverse tricks, ich sage nur: 'C++: where friends have access to your private members'
    🙂



  • ~fricky schrieb:

    c++ kennt doch diverse tricks, ich sage nur: 'C++: where friends have access to your private members'

    Dann musst du aber wieder alle Hilfsfunktionen in der Klassendeklaration auflisten (eben als friends), genau das sollte doch vermieden werden.



  • Badestrand schrieb:

    ~fricky schrieb:

    c++ kennt doch diverse tricks, ich sage nur: 'C++: where friends have access to your private members'

    Dann musst du aber wieder alle Hilfsfunktionen in der Klassendeklaration auflisten (eben als friends), genau das sollte doch vermieden werden.

    okay, dann war das ein mist-vorschlag. vergesst ihn einfach.
    🙂



  • Bashar schrieb:

    Alles mit void*. Wahnsinnig sauber.

    Das ist ja kein grundsätzliches Problem; siehe DECLARE_HANDLE().


Anmelden zum Antworten