C++/C lernen?

  • C++

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von Gamester.

    Hallo Leute,
    ich habe mich einige Zeit mit XNA beschäftigt und hab irgendwann mal gelesen, dass das bald aus der Mode sein wird:
    mitohnehaare.de/2011/09/16/xna-vor-dem-aus/

    Damit habe ich jetzt schon drei Gründe C/C++ zu lernen:
    1. Sie sind fundamentaler
    2. Sie werden nicht so schnell "aussterben"
    3. Sie unterstützten neue Technologien wie DX11,...


    Achja... Man kann damit Geräte programmieren - auch wenn das für mich wohl kaum eine Rolle spielen wird :D

    Wie soll ich also anfangen? Ich hab mich schon ein bisschen beschäftigt und die Syntax ist sehr ähnlich, wie C# (klar^^), wo ich mich auskenne.
    Könnt ihr mir irgendeine Literatur (in Buchform!) empfehlen, die in meinem Kaliber ist? (Nach oben hin sind natürlich alle Grenzen offen ;))

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Erstmal welches Buch nicht für den Hobby Programmierer geeignet ist: Undzwar "C++ lernen und professionell anwenden" aus dem mitp-Verlag. Das ist sehr trocken, behandelt sehr viele Themenbereiche, geht aber nicht aus der Programmierung von Konsolenanwendungen heraus.

    Was ich empfehlen kann ist "C++ für Spieleprogrammierer" von Heiko Kalister (Oder so).
    Der Autor behandelt hier Themen von "Hello World" bis hin zu eigenen Windows-Anwendungen und einem eigenen Spiel(leider mit einen veraltetem Framework). Ist nicht trocken aber auch kein Wälzer, eignet sich daher nicht als Nachschlagewerk ;)


    MfG
    Alsoo C++/C?
    Als erstes sind die beiden total verschieden!
    Was deine Gründe angeht würde ich mir es vll. doch nochmal überlegen, denn da hast du es mit anderen Sprachen oft mals leichter
    1. Fundamentaler soll heißen was?
    2. Aussterben zwar nicht aber von anderen Sprachen überholt schon. Das passiert schon jetzt, denn früher war noch wesentlich mehr in C++ usw. Heute ist Java und .NET eigentlich vorreiter.
    3. DX11? Wieso sollte das C# usw. nicht auch können. Es gibt einige Wrapper. Stichworte: SlimDX, SharpDX,...

    Was jedoch für z.B. C# spricht wären die Möglichkeiten was das rießige Framework angeht (hast du in C++ garantiert nicht, von dingen wie WPF,... mal abgesehen).
    Außerdem findest dies auch Anwendung was ASP.NET,... angeht. Was ich damit sagen möchte. C++ bietet bis auf Platformunabhängigkeit garantiert nicht viel mehr Möglichkeiten. Im Gegenteil da bietet dir C# oder Java garantiert mehr.

    "Damit kann man Geräte programmieren.": Nun ja das kommt auf das Gerät drauf an. Jedoch wird es eher selten verwendet, da dies bei WEITEM nicht alle Geräte unterstützen. (oder es sind nur abgewandelte c++ versionen...)
    Bei Geräten kannst du eigentlich froh sein, wenn du C verwenden kannst (was aber wieder was anderes wie C++ ist), aber was du so oder so auch öfters mal erleben wirst, ist Assembler usw. Ebenfalls werden dort manchmal dinge wie z.b. BASIC,... angeboten. Also C++ für Geräte naja würde ich nicht gerade so sagen.

    Ach ja das mit XNA kann natürlich sein. Ich fand das schon immer nur suboptimal. Auch daher, dass es nur Directx9 unterstützt.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Die Richtung C# => C++ => C wird Dir keinen Spaß machen, weil in .NET einfach alles (halbwegs) rund läuft und Du Dich nicht um das Aufräumen der Ressoutrcen kümmern musst.
    Zu jedem new gehört dann z.B. ein delete,
    Klassen haben dann einen Header, der überall da includiert werden muss, wo die Klasse verwendet wird,
    ...
    und das erfordert sehr sehr viel Disziplin.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dazu kommt, dass Deklarationen in den Headerdateien sind und die Definitionen in den Sourcedateien (was für mich und anscheinend auch für andere .net entwickler recht gewöhnungsbedürftig ist).

    Außerdem sollte man klar davon wegkommen, dass C und C++ im Grunde verschieden sind.
    C++ ist eine Objektorientierte Programmiersprache und das heißt nunmal, dass bei den "Very Basics" auch OOP ganz vorne steht.
    Natürlich gibt es auch Dinge die es in C noch gibt wie z.B. Zeiger oder auch die Datentypen.
    ABER C++ ist nieeemals C. So würde ich zum Beispiel sagen, dass ich halbwegs simple Dinge in C++ gut schreiben könnte, jedoch in C nicht wirklich eine Chance hätte.

    Das einzige was ähnlich ist, ist der Programmeinstiegspunkt. Kommt halt drauf an um was für eine Application es sich handelt. Bei Win32 ist es eben die WinMain oder bei "normalen" Applikaionen eben die klassische main. Wie auch immer. Alles was dann folgt ist eigentlich anders.
    z.B.
    Helloworld in c++ wird über den standartmäßigen std::ostream cout in die Konsole geschrieben.
    In C geht das noch über printf aus stdio.h (welche in c++ so oder so nicht mehr verwendet werden sollte).

    Davon abgesehen habe ich eh schon erwähnt, dass eben ein Großteil der Standartartbibliotheken erneuert wurden.

    Kurz C != C++ und das kannst du mir gerne glauben. Und wenn du nicht den Unterschied zwischen OOP-Sprachen und Nicht-OOP-Sprachen kennst solltest du so oder so die Finger C++ lassen.
    Denn auch dort gibt es nun anstatt char* die Klasse string usw.

    Ach ja und ich muss Rod vollkommen zustimmen.
    In .NET kannst du sehr schnell und einfach irgend etwas zusammenschreiben. In C++ muss eigentlich von Anfang an ein ganz klares Konzept vorhanden sein, denn wie gesagt die Sprache erfordert wesentlich mehr Disziplin.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    thefiloe schrieb:

    C++ ist eine Objektorientierte Programmiersprache und das heißt nunmal, dass bei den "Very Basics" auch OOP ganz vorne steht.

    Ich weiß nicht was du meinst - schließlich bin von Anfang an nichts als Objekte und Klassen und das ganze Zeug gewöhnt. Das wird sich doch nicht ändern, oder?
    Ok. Ich schreib halt ein "delete" nach dem Benutzen (so ähnlich wie Dispose), hab einen anderen Befehlssatz und etwas andere Syntax. Das mit den Headern hab ich glaub' ich nicht kapiert - let's google ;)

    EDIT:

    Wikipedia schrieb:


    Eine Header-Datei ist in der Programmierung, insbesondere bei den Programmiersprachen C++ und C, eine Textdatei, die Deklarationen und andere Bestandteile des Quelltextes enthält. Quelltext, der sich in einer Header-Datei befindet, ist im Allgemeinen zur Verwendung in mehreren Programmen oder mehreren Teilen eines Programmes vorgesehen.

    Also ein Art DLL?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Memo“ ()

    Wenn du C++ machst ändert sich was OOP angeht sehrwohl was aber immerhin gibt es Klassen.
    In C kannst du das vergessen. Dort ist das Highlight ne Struktur (aber nicht wie in .net mit methoden usw. sondern nur mit feldern).

    Was das delete angeht... das kannst du nicht mit Dispose vergleichen.
    Wenn du in .NET z.B. ne Klasse Person hast und sagst new Person() musst du garantiert kein Dispose aufrufen.
    In C++ muss der Speicher den du dir reservierst sprich mit new anforderst wieder freigegeben werden.
    Sowas kann man natürlich schnell vergessen und das hat Rod gemeint.

    Was OOP angeht gibt es wie bereits gesagt auch einige gröbere Änderungen. Zum Beispiel ist es in C++ Möglich Mehrfachvererbung zu verwenden. Aber details findest du sicher recht schnell heraus.

    Was das mit Klassen erstellen angeht... das wird meistens so gehandhabt, dass du eine Headerdatei erstellst mit z.b.

    class Person
    {
    public:
    void Reden(string text);
    };

    Und anschließend eine Sourcedatei erstellst (.cpp) und dort die erstellte Headerdatei einbindest.
    Nun muss die Methode nur noch definiert werden:

    void Person::Reden(string text)
    {
    ...
    }

    Aber wie gesagt wenn du das lernen möchtest, dann mach das denn schaden tut es garantiert nicht. Jedoch ist es Buch für den Einstieg garantiert zu empfehlen, da es einfach gewisse Dinge gibt die man wissen sollte.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    thefiloe schrieb:

    Aber wie gesagt wenn du das lernen möchtest, dann mach das denn schaden tut es garantiert nicht.

    Warum auch? Denke das ist so eine Sprache wie Englisch in der Programmiererwelt ;)

    Dann such' ich mir mal das "C++ für Spieleprogrammierer" ^^
    Wenn C "eh nur" für Treiber und Betriebsysteme und so low-level Zeug wirklich sinnvoll ist, dann werd'
    ich es nicht so schnell treffen ;)

    Renati schrieb:

    Mit dem kann man nicht ernsthaft C++ lernen.

    C++ lernen mit dem MSVC ist eher "train by lose" - Lernen durch Verlieren. Man sollte schon die Einstellungsseiten verstehen, um damit zu arbeiten. Dann ist er aber ein relativ mächtiges Werkzeug.

    @Memo:
    Löse dich unbedingt von folgendem Gedanken: "Ich lese ein C++-Buch und kann dann [X] programmieren." Dabei ist [X] ein beliebiges Programm aus folgender unvollständiger Liste:
    - Grafikausgabe (Windows Forms, WPF, GTK, ...)
    - Spiele
    - "Systemprogramme" (Treiber, LowLevel-Kram)
    - COM und auch sonst viele Microsoft-spezifische Dinge

    Für Anfänger ist C++ im Vergleich zu VB nicht angenehm, vor allem wenn du es in der Richtung VB->C++ lernst. Wenn du dein Buch gelesen hast, kannst du effektiv einen Taschenrechner für die Konsole schreiben. Dabei kennst du aber noch keine einzige Bibliothek, geschweige denn deren Funktionsumfang. In .NET kommt alles aus einer Hand, bei C++ von überall her. Vielfalt kann manchmal auch erdrückend sein. Folgendes Beispiel: "Ich will ein Fenster für mein Windows-Programm". Ja, nehme ich nun für das Rendering Qt, GTK+ oder WxWidgets oder...... du merkst, worauf ich hinaus will?

    Und ganz wichtig: Wenn dein C++-Programm startet, heißt es nicht, dass es funktioniert. Wenn ein VB-Programm startet, sind die gröbsten Fehler raus, d.h. es kommen nur noch Kleinigkeiten wie "Arraygrenze überschritten" oder "Datei nicht gefunden". "Nach jedem new einfach ein delete" funktioniert schonmal gar nicht, weil der Kontrollfluss des Programms oftmals nichtlinear ist. Außerdem kommt dazu, dass in C++ ziemlich viele Dinge implizit und ohne dein Wissen passieren. So entsteht schnell mal ein Memory-Leak, weil ein Objekt implizit kopiert wurde, als es an eine Funktion übergeben wurde... Das führt dazu, dass C++ sehr viel mehr auf Erfahrung als auf Faktenwissen aus Büchern basiert. Das soll jetzt nicht heißen, dass du nach dem Trial-and-Error-Prinzip vorgehen sollst - es heißt vielmehr (wie der vorige Absatz schon sagen soll), dass C++-Bücher mit der Bodenplatte eines Hauses vergleichbar sind: Sie bilden ein Fundament, nichts weiter. Bauen musst du dann selbst.

    Ich will dir nicht von C++ abraten - lerne es, verstehe es, nutze es. Aber eine Erkenntnis aus eigener Erfahrung sollte ich dir mitteilen: In der ersten Zeit macht C++ vor allem eins: Ne Menge Ärger.
    Gruß
    hal2000

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()

    hal2000 schrieb:

    Für Anfänger ist C++ im Vergleich zu VB nicht angenehm

    Ich bin nicht wirklich ein Anfänger. Außerdem kommt es auf das Buch an, was du liest.
    Was soll ich tun? Irgendwann "muss" ich es sowie so lernen und ich möchte nicht immer auf DirectX 9 und XNA bleiben (mir sind die Vorteile durchaus bewusst ;)), was jetzt nicht heißt, dass ich jetzt einen Compiler runterlade und denke, jetzt gehts los mit Spielen :whistling:

    Memo schrieb:

    Außerdem kommt es auf das Buch an, was du liest.
    Es kommt vor allem auf die Aufgabe an, die Di bearbeitest.
    Wenn die motivierend ist und das Buch ist sch..., wechselst Du lieber das Buch als andersherum die Aufgabe.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Memo schrieb:

    Ich bin nicht wirklich ein Anfänger

    Trotzdem nicht angenehm ;) Hab mich mal ein Jahr intensiv damit beschäftigt, da ich es für ein sehr spezielles Projekt brauchte. Im Prinzip: Ätzend ;) Manche Sachen sind toll, aber vieles auch unglaublicher Fummelkram und wenn man dann bei irgendeinem komplexen Ding feststellt, dass man offensichtlich irgendwo 10 Byte "liegenläßt", dann ist das Gesuche ne echte Fleißaufgabe.
    Ich persönlich würde C/C++ nur noch für extrem kleine Sachen verwenden, die halt so performancekritisch sind, dass man sie besser in C umsetzt. Selbst da gilt: Managed ist nicht ZWANGSLÄUFIG langsamer!

    BTW: XNA ist "nur" eine Erleichterung. Man kann für Directx (auch 11) auch andere Wrapper verwenden (slimdx.org/) oder sich halt den Kram selber basteln, den man braucht.

    hal2000 schrieb:

    C++ lernen mit dem MSVC ist eher "train by lose" - Lernen durch Verlieren. Man sollte schon die Einstellungsseiten verstehen, um damit zu arbeiten. Dann ist er aber ein relativ mächtiges Werkzeug.

    Ich meinte auch eher die sehr eigenwillige Interpretation des C++-Standards durch Microsoft und der elendig langsame Fortschritt in der Unterstützung von C++11. Klar, Visual Studio ist eine tolle Entwicklungsumgebung und hat viele nützliche Funktionen. Aber den unterliegenden Compiler sollte man wohl nur verwenden, wenn man signifikanten Gebrauch von Microsoft-APIs macht. Für alles andere lässt man meiner Erfahrung nach besser die Finger davon oder nimmt einen Bruch des Quellcodes mit allen anderen Compilern in Kauf.

    Memo schrieb:

    Ich bin nicht wirklich ein Anfänger.
    So war das nicht gemeint - ich meinte "Anfänger in C++", nicht "Anfänger im Programmieren".

    Renati schrieb:

    eigenwillige Interpretation des C++-Standards durch Microsoft
    Ich finde diese Eigenwilligkeit eigentlich ganz in Ordnung - solche Sachen wie TCHAR finde ich recht nützlich. Ich frage mich aber immer noch, warum die ursprünglichen Datentypen in bestimmt 5 typedef-Ebenen verpackt wurden...
    Gruß
    hal2000

    hal2000 schrieb:

    Ich finde diese Eigenwilligkeit eigentlich ganz in Ordnung - solche Sachen wie TCHAR finde ich recht nützlich. Ich frage mich aber immer noch, warum die ursprünglichen Datentypen in bestimmt 5 typedef-Ebenen verpackt wurden...

    Aha, dann ist dir vermutlich ein Kardinalfehler in der Verwendung von C++ unterlaufen. Der Schlüssel zum Umgang mit C++ ist nämlich, zu wissen, warum Entscheidungen bei der Konzeption von C++ so und nicht anders getroffen wurden - insbesondere dann, wenn man sich für eine andere Lösungen entscheidet. Bjarne Stroustrup ist nicht verlegen darum, das immer und ständig zu wiederholen.
    Falls du also tatsächlich feststellst, dass du nicht weißt, warum irgendetwas im C++-Standard so gelöst wurde und nur gut findest, dass Microsoft es anders gemacht, muss dich das aber nicht besonders ärgern. Die meisten Nutzer des Microsoft-Compilers machen diesen Fehler und bemerken ihn erst, wenn ein Nutzer eines standardkonformen Compilers ihn darauf anspricht. Das geht dann meinen Beobachtungen zu Folge meistens - sofern möglich - mit einem Wechsel des Compilers einher. Und natürlich einem zweiten Kennenlernen von C++, diesmal dann des "echten"... ;)
    Darüber, warum gerade C zwischen Groß- und Kleinschreibung unterscheidet, gibt es heute meines Wissens keine Aufzeichnungen (mehr). Vermutlich haben eine oder mehrere der folgenden Erwägungen dahinter gestanden:
    • Keine Unterscheidung zwischen Groß- und Kleinschreibung kostet. Das ist heute zwar sicherlich vernachlässigbar, war in den 70er Jahren, als C erfunden wurde, aber vielleicht ein Entscheidungsgrund.
    • Mit Groß- und Kleinschreibung unterscheiden viele Programmierer den Kontext. Private Member beginen mit einem Kleinbuchstaben, öffentliche mit einem Großbuchstaben - oder sowas. Wenn man eine Variable nun falsch schreibt bei der Benutzung, wäre das zwar erstmal nicht schlimm, man würde aber offenbar von einem falschen Kontext ausgehen.
    • Ganz banal: Weil (fast?) jede natürliche Sprache, die lateinische Buchstaben nutzt, es auch tut. das war jedenfalls damals so und ist auch heute noch außerhalb des internets so... ;)

    Für solche Legacy-Geschichten bis hinunter zur Erfindung von C bin ich aber eigentlich noch zu jung, um das miterlebt zu haben und es genau zu wissen. ;)
    Bei C++ sieht das ganze wieder einfacher aus: C++ ist (unter anderem) case-sensitive, weil C es auch ist. Die (weitgehende) Abwärtskompatibilität von C++ zu C ist halt das Paradebeispiel für Fluch und Segen zugleich, das einem als Programmierer zusätzliche Disziplin abverlangt.