C++ lernen?



  • Hallo, ich bin Fred, Schüler und 16 Jahre alt. Ich programmiere seit einem Jahr in C und Assembler und möchte nun auch C++ lernen. Eigentlich gefällt mir C ganz gut aber meine Freunde sagen immer daß C++ besser ist. Viele Spiele sind in C++ programmiert worden. Ich habe mir einige C++ Tutorials angesehen und muß sagen, daß C++ ganz schön schwierig ist! Die Sache mit den Klassen und Vererbung bereitet mir Kopfzerbrechen. Wozu braucht man das eigentlich? Habt ihr vielleicht ein Beispiel dafür? Und, könnt ihr mir gute Bücher oder Tutorials zu C++ empfehlen? Ich möchte übrigens später technische Informatik studieren, da ich mich sehr für hardwarenahe Programmierung interessiere. Braucht man dafür C++ oder sollte ich lieber bei C und Assembler bleiben?
    Vielen Dank und ich hoffe es waren nicht zu viele Fragen auf einmal.



  • Fred vom Jupiter schrieb:

    ...Eigentlich gefällt mir C ganz gut aber meine Freunde sagen immer daß C++ besser ist. Viele Spiele sind in C++ programmiert worden...

    Es hängt vom Anwendungsfall ab was besser ist. Ich empfinde OO-Sprachen wie C++/Java/C#... bei großen Objekten übersichtlicher und logischer strukturiert. Bei kleinen Projekten mag dies noch nicht so sein.

    Fred vom Jupiter schrieb:

    Ich habe mir einige C++ Tutorials angesehen und muß sagen, daß C++ ganz schön schwierig ist!

    Eigentlich auch nicht schwieriger als C oder Assembler. Was vielleicht ungewohnt ist, ist die unterschiedliche Herangehensweise zwischen Prozeduraler und Objektorientierter Programmierung. Letztere ist aber IMHO dem menschlichen Denken näher. Wenn du einen Baum ansiehst, siehst du dir erst die Struktur an oder abstrahierst du?

    Fred vom Jupiter schrieb:

    Die Sache mit den Klassen und Vererbung bereitet mir Kopfzerbrechen. Wozu braucht man das eigentlich?

    Zum Abstrahieren eines komplexeren Sachverhaltes, zum Kombinieren von zusammengehörigen Funktionen und Daten, zum Steigern der Wiederverwertbarkeit (auch wenn dieser Punkt nicht so weitgreifend ist wie bei den ersten Aufkommen des OO-Begriffes propagiert).

    Die Vererbung wiederum spielt eine sehr entscheidende Rolle wenn es um Austauschbare Bereiche geht. Nehmen wir ein Standardbeispiel: Ein Programm mit vielen Grafikobjekten (typisches Vector-Malprogramm). Man spricht die Grafikobjekte über eine Basisklasse an, die konkreten Umsetzungen und unterschiede liegen aber in den Abgeleiteten Klassen (Vererbung).

    Beispielsweise: Kreise, Quadrate, Striche... Allesamt haben unterschiede, man versucht aber möglichst das was alle verbindet zu kombinieren. Mal sehen: also z.B. kann man jedes der Objekte zeichnen (wie ist wiederum abhängig vom Objekt), man kann alle diese Objekte drehen oder verschieben... Die allgemeinen Funktionalitäten stopft man nun in die Basisklasse "Grafikobjekt". Sofern die Behandlung überall exakt gleich ist, implementiert man dies auch dort. Ansonsten sagt man das die Methode der Klasse "virtuell bzw. akstrakt" ist, und implementiert diese in den abgeleiteten Klassen. Der Aufruf erfolgt über den Zeiger der Basisklasse, die vererbung in Zusammenhang mit virtuellen Methoden sorgt dafür das die richtige Funktionalität verwendet wird.

    Dies erleichtert die Programmierung, da man sich weitgehend an der Schnittstelle der Basisklasse orientiert, und nicht die Implementationsdetails kennen muss. Nächstes Beispiel: Ein Plattformübergreifendes Grafikframework. Man schreibt eine Basisklasse für die wesentlichen GUI-Elemente, die plattformspezifischen Implementationsdetails werden dahinter verborgen...

    Zudem hat C++ noch ein paar weitere Möglichkeiten die auch über die prozedurale und objektorientierte Programmierung hinweg gehen (Templates und Templatemetaprogrammierung mal als Beispiele).

    Fred vom Jupiter schrieb:

    Und, könnt ihr mir gute Bücher oder Tutorials zu C++ empfehlen? Ich möchte übrigens später technische Informatik studieren, da ich mich sehr für hardwarenahe Programmierung interessiere. Braucht man dafür C++ oder sollte ich lieber bei C und Assembler bleiben?

    Auch in der hardwarenahen Programmierung ist C++ durchaus verbreitet. Es schadet natürlich nichts wenn man beide Ansätze kennt. Die meisten Universitäten lehren zudem eine Objektorientierte Sprache. Als guten Überblick über C++ empfinde ich "Moderne C++ Programmierung" vom Springerverlag, wobei es mit Sicherheit bessere Einstiegsliteratur gibt.

    cu André



  • Hallo Fred,

    willkommen hier im C++-Forum.
    Das mit den Klassen und der Vererbung ist schwierig zu erklären, wenn Du nur relativ wenig Programmiererfahrung hast. Vielleicht so:
    Grundsätzlich musst Du jedes größere Problem - wenn man es beherrschen will - in kleinere Stücke zerlegen. Als man mit der Informatik begann, unterteilte man zunächst in Daten und Funktionen. Man merkte aber sehr schnell, dass das recht ungünstig war, da einige Funktionen fest mit bestimmten Daten verbunden sind. Später kam man dann darauf, ein informationstechnisches Problem in sogenannte Objekte zu zerlegen. Ein Objekt besteht i.A. aus Daten UND Funktionen, die eben stärker zusammen agieren als das Objekt selbst mit anderen Objekten. Ein derartiges Programm ist - wenn's richtig gemacht ist - leichter zu beherrschen, vor allen in größeren Systemen.

    Einige Links zu Tutorials gibt's hier im Forum.

    Wenn Du dass später beruflich machen willst, ist es sicher von Nutzen C++ zu lernen, auch wenn es nicht einfach ist. Das wichtigste ist, dass Du Spaß an der Sache hast - und wenn Du mal nicht weiter weist, so findest Du hier im Forum jederzeit Hilfe.
    Auch wenn Du später hardwarenah arbeiten willst, sind Kenntnisse in C++ von Vorteil. Selbst wenn Du nur in C programmierst lernst Du mit C++ (hoffentlich! 😉 ) eine neue Art zu denken, die Dir sicher hilft.

    Gruß
    Werner



  • Klassen und Vererbung haben sich mir zu Anfang auch nicht erschlossen (hatte vorher hauptsächlich Assmebler programmiert). Ich bin dann beruflich in C++ eingestiegen und habe in dem Projekt Klasse bzw. OO einfach _hingenommen_. Ich hatte den Vorteil (?) das ich in ein bestehendes Projekt reinkam und dieses neuen Anforderungen wegen "umbauen" mußte. Als ich dann nach 2-3 Monaten an einer Stelle angelangte, wo ich radikal das Userinface umbauen mußte, hat es bei mir *klick* und "Aha!" gemacht.

    Es ist wirklich so, das man mit proceduraler Programmierung ein Ziel erreichen kann. Deshalb erschliesst sich einem die OOP nicht gleich, wahrscheinlich sogar weil man unbewusst eine Blockade dagegen aufbaut. Ich hatte auch immer gesagt "Wozu OO??? Brauch ich nicht!". Aber ich kann nur eines sagen: wenn es hart auf hart kommt, ist OOP einfach genial. Und dieses Erlebnis mußt du noch bekommen. Dazu mußt du entweder ein eigenes OO-basiertes Projekt entwickeln (es muß aber schon umfangreicher sein) oder am besten in ein bestehendes OO-basiertes Projekt rein gehen und es modifizieren, erweitern...



  • Hallo Leute! Vielen Dank für die vielen ausführlichen Antworten. Euer Forum ist einsame Spitze!!!

    André und Werner, die Erklärungen zu OOP leuchten mir ein. Im Prinzip ist es also so, daß mit OOP auf einer Ebene programmiert wird, die dem Menschen näher ist als dem Computer. Verstehe ich das richtig so?

    Artchi, Ich möchte auf jeden Fall C++ und OOP lernen, wenn ich auch noch nicht genau weiß wofür es in meinem Fall nützlich sein könnte. Aber allein schon aus purem Interesse.

    Ich habe übrigens noch eine Frage. C++ Code wird genau so wie C Code in Maschinensprache übersetzt. Wie ist es dabei mit den Objekten? Benutzt C++ dafür eine Library, die meine Objekte verwaltet oder wie funktioniert das? Ich frage aus dem Grund, weil ich eventuell C++ für meine Mikrokontroller benutzen möchte.
    Danke!!!



  • Fred vom Jupiter schrieb:

    André und Werner, die Erklärungen zu OOP leuchten mir ein. Im Prinzip ist es also so, daß mit OOP auf einer Ebene programmiert wird, die dem Menschen näher ist als dem Computer. Verstehe ich das richtig so?

    Kann man in etwa so stehen lassen. Das Hauptprinzip ist das man bei OO mehr abstrahiert und Implementationsdetails verbirgt. Man behält so den Überblick und kann (im Idealfall) Bereiche leichter austauschen.

    Und bei OO betrachtet man Funktionalität und Daten zusammenhängend (Stell dir einfach einen DVD-Spieler vor: Nach außen hin eine einfache Schnittstelle hält er innen alle Implementationsdetails verborgen).

    Fred vom Jupiter schrieb:

    ...Ich möchte auf jeden Fall C++ und OOP lernen, wenn ich auch noch nicht genau weiß wofür es in meinem Fall nützlich sein könnte. Aber allein schon aus purem Interesse.

    Im Hardwarebereich kenne ich mich leider nicht so aus, aber ich kenne einige sehr weltweit agierende Firmen die C++ in der Hardwareprogrammierung verwenden.

    Fred vom Jupiter schrieb:

    Ich habe übrigens noch eine Frage. C++ Code wird genau so wie C Code in Maschinensprache übersetzt. Wie ist es dabei mit den Objekten? Benutzt C++ dafür eine Library, die meine Objekte verwaltet oder wie funktioniert das? Ich frage aus dem Grund, weil ich eventuell C++ für meine Mikrokontroller benutzen möchte.

    Vereinfacht gesprochen kommt am Schluß immer das gleiche raus. Es gibt sogar C++ Compiler (oder sollte man lieber C++ Fronend Compiler sagen) die zuerst aus dem C++ Code C generieren. So z.B. der Comeau C++ Compiler (der Compiler der den C++ Standard wohl mit am besten abdeckt). Für einen normalen Programmierer ist eigentlich auch egal was der Compiler macht, es geht um den Ansatz. OO dient in erster Linie zur Vereinfachung der Programmierung bei größeren Projekten.

    Beispielsweise werden Virtuelle Methoden über Sprungtabellen (Funktionszeiger) gelöst, und eine Methode (Funktion einer Klasse) kannst du dir in etwa wie folgt vorstellen:

    // C++
    class A
    {
      private:
        int a;
      public:
        void setA(int a)
        {
           this->a = a;
        }
    };
    
    // Das ganze in C
    struct A
    {
      int a;
    };
    void setA(A* this, int a)
    {
       this->a = a;
    }
    

    Bestimmte konstrukte (wie Zugriffsmodifizierer) "überleben" nicht zwingend die Übersetzung. Diese werden vor der eigentlichen Erstellung überprüft.

    cu André



  • Also die Objekte sind letztendlich vergleichbar mit den "struct"-Objekten aus C. D.h. die sprichtst du entweder über einen Pointer (Heap/Freestore) an oder über eine Variable im Scope (Stack).

    Eine Verwaltung von Seiten der Runtime gibt es nicht. Man kann aber Garbagecollection oder Smartpointer verwenden, um das Leben einfacher zu machen.

    C++ wird auch in Microcontroller/Embedded-Bereich eingesetzt. Hauptsache es gibt dafür einen Compiler.



  • WOW, Leute ihr erstaunt mich! Noch nie konnte es mir jemand so gut erklären wie ihr. RESPEKT!!!! Woher wisst ihr das alles so genau?
    Ich muß schon sagen, daß ich eine völlig falsche Vorstellung von C++ hatte. Man kann mit C++ also auf einer höheren Abstraktionsebene programmieren aber ohne gleichzeitigen Kontrollverlust. Das ist einfach phantastisch!
    Aber bevor ich euch weiter mit Noob-Fragen bombardiere, schaue ich mir erstmal die Tutorials an, die Werner empfohlen hat. Naja, eine kleine Frage hätte ich doch noch: Wo kann ich den Comeau C++ Compiler downloaden, oder muß man den kaufen?



  • Fred vom Jupiter schrieb:

    Naja, eine kleine Frage hätte ich doch noch: Wo kann ich den Comeau C++ Compiler downloaden, oder muß man den kaufen?

    Den Comeau C++ Compiler kann man für etwa 50 Dollar kaufen, wobei man für diesen einen Backend-Compiler braucht (z.B. MSVC++ oder andere). Ich weiß auch nicht ob du mit dessen Ausgabe etwas anfangen kannst, zudem hat der Comeau keine direkte IDE-Unterstützung.

    Ich würde dir zu einen üblichen, aber möglichst aktuellen C++ Compiler raten. Ob nun z.B. unter Windows MSVC++ 2005 (die Expressedition ist kostenlos) unter Linux den GCC...

    cu André



  • Hallo Leute,
    Ich habe mich etwa ein halbes Jahr mit C++ beschäftigt, aber ich glaube daß das nichts für mich und meine Zwecke ist. 😞
    C++ ist ganz nett, z.b. nimmt einem die STL viel Arbeit ab, aber irgendwie ist alles viel(!) komplizierter, es gibt 1001 Möglichkeiten. Aber C++ hat für mich keinen Mehrwert gebracht.
    Ich bleibe bei meinem "einfachen" C. Hab mich wohl zu sehr daran zu sehr gewöhnt und alles geht viel lockerer von der Hand.

    Trotzdem danke für eure Hilfe.

    Fred
    :schland:



  • was hastn so in der zeit alles auf die beine gestellt?
    hattest du lektuere?
    wie ist mitlerweile dein wissensstand ueber oop?



  • Fred vom Jupiter schrieb:

    Ich habe mich etwa ein halbes Jahr mit C++ beschäftigt, aber ich glaube daß das nichts für mich und meine Zwecke ist. 😞

    Kann passieren. C++ ist auch nicht das Allheilmittel. Etwas verstehe ich aber nicht...

    Fred vom Jupiter schrieb:

    C++ ist ganz nett, z.b. nimmt einem die STL viel Arbeit ab,... Aber C++ hat für mich keinen Mehrwert gebracht.

    ... also entweder dir wird Arbeit abgenommen und du hast Mehrwert, oder du machst dir die gleiche Arbeit und hast keinen Mehrwert.

    cu André
    P.S: Imho ist C++ so kompliziert wie man es sich selbst macht.



  • 👎

    C++ heißt doch nicht gleich jeden Schmarrn in ne Klasse zu packen und zigmal zu vererben...

    Du willst also wirklich bei reinem C bleiben? Ist eine dumme Entscheidung, sry.

    Naja viel Spaß mit char*, printf, strcpy, strcmp, strcat und dem ganzen Klump 👍



  • eventuell hast du den fehler gemacht alles zwanghaft in klassen kapseln zu wollen



  • Ich verstehe auch nicht, inwiefern C++ kompliziert sein soll. Schließlich ist fast jeder C-Code auch gültiger C++-Code... C++ gibt dir lediglich mehr Möglichkeiten, die du nutzen kannst, aber nicht musst. Allein schon std::string und den Standardcontainern sind ein Grund, C++ vorzuziehen. Falls dir Templates zu kompliziert sind, kannst du dir ja vorerst nur die Grundlagen darüber aneignen.
    Vielleicht hast du wirklich versucht, alles irgendwie in Klassen zu stopfen? Es ist vielleicht besser, anfangs alles so wie in C zu machen... auf die Idee, Klassen für einzelne Datenstrukturen zu verwenden, kommst du dann mit der Zeit von selbst. Und auf diesem Weg erschließt sich damit dann auch automatisch deren Sinn für dich.



  • Hallo,

    Mr Evil schrieb:

    eventuell hast du den fehler gemacht alles zwanghaft in klassen kapseln zu wollen

    Ja das kann sein. Vielleicht war meine Erwartungshaltung zu hoch. Ich wollte zu viel in zu kurzer Zeit erreichen und alle Möglichkeiten von C++ kennenlernen. Im Endeffekt habe ich aber gemerkt, daß alles was ich mit C++ gemacht habe, in C viel einfacher ist. Bitte versteht mich nicht falsch. Ich habe nichts gegen C++, nur ist es für meine Zwecke zu überladen und bringt mir nichts.

    :schland:
    Fred



  • Wir sehn uns wieder, wenn du mit folgendem in ANSI-C Forum auftauchst 😉

    void func(struct blubb* obj)
    {
    /* 1 */ switch(obj->flag) {
    /* 2 */ case 0:
               obj_foo(obj);
               break;
    /* 5 */case 1:
               break;
            case 2:
               /* ... */
               break;
            case 3:
               /* ... */
               break;
            case 4:
               /* ... */
    /* 15 */break;
        }
    }
    

    und du Krampfhaft versuchst, Polymorphismus in C umzusetzen. Dann wird dir klar werden, dass

    class Base: {
    public:
        virtual ~Base() { }
        virtual void foo() = 0;
    };
    
    class Der1: public Base { /* ... */ };
    class Der2: /* ... */
    // ...
    class Der5: public Base /* ... */
    
    void func(Base& b)
    {
    /* 1!!! */ b.foo();
    }
    

    viel mehr Arbeit abnimmt, wartbarer und auch einfacher erweiterbar ist.

    Naja, du wirst deine Erfahrungen noch machen.


Anmelden zum Antworten