struktureller Sinn von Klasse bzw Objekten



  • Hallo liebe Mitglieder,
    Ich habe eine allgemeine Anfängerfrage zu c++, wenn man in c++ anfängt aus Büchern Programmbeispiele zu üben, merkt man, dass man eingentlich dieselben
    einfachen Programme, die man in c mit Eingabe Ausgabe Ergebnis strukturiert hat,
    plötzlich umständlich in Klassen und Funktionen aufteilt. Beispiel:

    #include<iostream>
    using namespace std;
    
    class objekt {
    private: 
    int breite,hoehe;
    public:
    void werteingabe(int,int);
    int berechnung(){return breite*hoehe;}
    };
    
    void objekt::werteingabe(int x, int y){breite=x;hoehe=y;}
    
    main(){
    objekt blue;
    blue.werteingabe(55,99);
    cout<<"\nFlaeche:"<<blue.berechnung()<<"\n";
    return 0;
    }
    

    in klassichem C-Stil hätte man

    Titel
    int ... Variablen
    Printf("Bitte Eingabe...");
    scanf("....
    Berechnung
    Printf("Ausgabe des Ergebnis...
    

    eine andere Struktur benutzt. Der Sinn dessen ist, soweit Ich das bisher sehe,
    die main funktion bei größeren und komplexeren Projekten zu entlasten und
    so die Programme übersichtlich zu gestalten. Man transferiert hier quasi auf
    lange Sicht Programmthemen in Klassen und Objekte.
    Da Ich selber zwar schon einige kleine C Programme aber keine großen c++ Programme geschrieben habe oder mich mit komplexen c++ Programmen/Anwendungen
    auskenne, denke Ich, dass das so ist.

    Jemand der in c++ professionelle Erfahrung hat müsste das sicher wissen ?



  • So verwendet man das ja auch alles nicht.



  • Dann würde ich gern den Quellcode deines Office-Pakets sehen, in die komplette Funktionalität in der main() Funktion implementiert ist. 😮



  • Kommentare zum Code (auch wenn ein wenig OT):

    softpad schrieb:

    #include<iostream>
    using namespace std;
    
    class objekt {
    private: // Darüber lässt sich streiten
    int breite,hoehe;
    public:
    // Wieso kein Konstruktor?
    void werteingabe(int,int);
    int berechnung(){return breite*hoehe;}
    };
    
    void objekt::werteingabe(int x, int y){breite=x;hoehe=y;} // Wieso nicht auch innerhalb des Klassenrumpfs definiert?
    
    main(){ // Rückgabetyp fehlt, default-int gibt's in C++ nicht mehr
    objekt blue;
    blue.werteingabe(55,99);
    cout<<"\nFlaeche:"<<blue.berechnung()<<"\n";
    return 0;
    }
    


  • Das Ding ist letztlich: Viele Problemchen kannst du gerne mal eben so schnell in sehr sehr vielen Sprachen als 3 oder 5 Zeiler schreiben. (In C++ geht das auch, da C eine Teilmenge von C++ ist.)

    Das Problem ändert sich nur stark, wenn das ganze drum herum komplexer wird. Da wird je nach Kontext aus einer kleinen Fakultätsfunktion von 3 zeilen eine Funktion oder sogar Klasse, die noch Error und typhandling mit einbaut doer in statischen Fällen das Ergebnis zur Compilezeit berechnen lässt und und und...

    Kurzum, sowohl in C++ als auch allen anderen Sprachen kannst du einzelne Problem für sich alleine mal eben schnell so runtertippen. Aber in größeren (Projekt-)Umgebungen geht das auf einmal nicht, es ist eifnach die Komplexität die dann auch komplexere Konstrukte fordert.

    Ich könnte da grad mal eins meiner Projekte aus der Firma anführen:
    Javascript ist eine einfache Sprache (was auch das Ziel von Brendan Eich ist) und damit hat man für eine Website mal schnell ein kleines Script geschrieben, was en coolen (visuellen) Effekt hat. Und das auch schnell und sehr fehlerfrei.
    Bei dem Projekt, was ich mache wurden für eben fast die Aufgabe Beispiele veröffentlicht, die ungefähr 95% der Projektanforderungen erfüllen. Mit etwas Konfigurationscode keine 200 Zeilen.
    Soweit so gut, sieht toll aus, ging nach entsprechender Einarbeitung leicht von der Hand.

    Kehrseite der Medaille: Es sind eben nur 95% erfüllt. Und diese 5% machen mir grad das Leben zur Hölle, der Code ist um locker das 5fache größer geworden (und 1000 Zeilen sind eigentlich noch nicht viel!). Es läuft viel langsamer.
    Aber das Ding ist, die Sprache selbst nervt schon total. Aufgrund der Dynamik kommt keine Entwicklungsumgebung da mit: Autovervollständigung gibts nicht, Tippfehler werden kaum erkannt, selbst der Browser gibt kaum Fehler doer Warnungen raus und man darf dann in der Scheisse wühlen, bis man gefunden hat was nicht ging. Was dann aber durch die Nutzung von externen Bibliotheken nochmal stark verkompliziert wird.

    Bsp: Man gibt ein Objekt falschen Typs an eine Funktion, klar klappt das nicht. Aber die Fehlermeldung ist dann im Callstack ungefähr 20000000000k Billiarden Stufen weiter unten und als Fehlermeldung kommt "e hat keinen Member namens xXx".

    Die Sprache ist zwar einfach, aber komplexe Dinge damit und vor allem Dinge, die nicht von Anfang an eingeplant waren, sind sowas von schwer und enrvig nachzuholen. Ich frag mich immer wieder wie solch ein Häufchen so erfolgreich werden konnte (Blabla bla Client MVC und so weiter).

    Wer ein auch nur mittelgroßes Projekt in JavaScript schreiben muss hat seine Absolution schon erhalten. Der kann für den Rest seines Lebens sündigen, und wird trotzdem nie mehr auf 0 runterkommen.



  • Danke Skym0sh0,
    das hatte Ich ungefähr gemeint...,
    Ich habe (als Neuling) die Funktionalität von Klassen bisher eher so verstanden, dass jedes Objekt für sich auch einen Programmteil darstellen kann ,d.h. man muss in C++ sehen, dass eigentlich alles immer nur aus Funktionen besteht d.h. es ist ja eigentlich egal, ob Ich ein durch einen Algorithmus zu lösendes Problem in der main implementiere oder in einer Funktion einer Klasse und gleichzeitig die zugehörigen Variablen in der Klasse hinterlege. Es ist in beiden Fällen nämlich dasselbe. Was man in der main verzweigt,kann man genauso in der Funktion einer Klasse .... ?



  • Das Beispiel ist sehr klein. Schau dir aber mal etwas groesseres an, wie z.B. std::vector.
    Der Container waechst dynamisch mit, hat gute Laufzeiten, man kann an beliebigen Stellen Elemente einfuegen, hat keine Memory-leaks und die ganze Funktionalitaet, die man in C haette selber implementieren muessen, ist in eine Klasse gekapselt.



  • mach Ich mal, Danke!



  • Du kannst für kleine Programme C++ auch völlig ohne Klassen programmieren. Das ist ja gerade das Tolle an einer Multi-Paradigmen-Sprache. Du kannst vieles machen, musst es aber nicht. Ich programmiere auch noch nicht so lange in C++ und vieles habe ich noch nie genutzt, so wie ich vieles bei Word noch nie genutzt habe. Wenn man eine Funktionalität aber mal braucht, dann hat man sie direkt von der Sprache unterstützt parat. Zum Beispiel OOP oder Namespaces, sobald mein Projekt 4 oder 5 Dateien hat, fange ich schon schon an zu Strukturieren. In C endetete das meist bei mir mit langen Funktionsnamen ala MEINELIB_modulnamen_funktiongruppe_init oder so was, das wurde dann irgendwann total anstrengend.

    Ich habe das bis jetzt so gemacht, dass ich irgendwas bis zu einem bestimmten Punkt gelernt haben, aber dann ganz schnell angefangen habe Projekte damit zu machen. Denn das ist in meinen Augen der Sinn einer Sprache, das man sie spricht und nicht dass man sie bis ins kleinste beherrscht.



  • Bingo, Noch en kleiner Nachtrag:

    Objekt Orientierung sit auch mit C ganz gut möglich. Aber es braucht einen massiven Overhead. Das fängt damit an, dass statt Memberfunktionen halt freie Funktionen die als ersten Parameter halt ein Strukt erwarten (als this Zeiger) geschrieben werden müssen. Und geht dahin, dass man Vererbung und Polymorphie selbst mit vtable implementiert. Daher, möglich ja, sinnvoll eher weniger wenn man stattdessen eine ObjektOrientierte Sprache nutzen kann/sollte/darf.

    Oder kurz gesagt, bei wachsender Komplexität wächst auch die Menge von Boilerplatecode ins Unermessliche.

    Entweder:

    namespace A
    {
        namespace B
        {
            namespace C
            {
                namespace D
                {
                    void foo();
                }
            }
        }
    }
    
    // someImpl.cpp
    using A::B::C::D::foo;
    foo();
    //...
    foo();
    

    Oder:

    void A_B_C_D_foo();
    
    // someImpl.c
    A_B_C_D_foo();
    // ...
    A_B_C_D_foo();
    

    Im Prinzip das gleiche, aber hat dann doch feine Unterschiede.
    Und so geht das mit sehr vielen Sprachen. (Ja, auch JavaScript bietet ein Namespace-Idiom)


Anmelden zum Antworten