native oder moderated für den windowseinstieg besser?



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Sollte ich dann als Hobbyprogrammierer eher auf(was die Windowsprogrammierung angeht) doch lieber Delphi, c# oder VB umsteigen?

    Mit Delphi habe ich sogar etwas Erfahrung, aber bei der fortgeschrittenen Programmierung in Delphi wird der Code doch genauso schwer sein wie in c++ oder? Also ist das Problem doch nur die Erstellung von Windowsprogrammen oder? 😛

    Also meine Frage an euch, die Ihr wesentlich mehr Erfahrungen in Softwareentwicklung habt, macht es Sinn für einen Anfänger wie mich sich überhaupt mit der Windowsentwicklung unter c++ zu beschäftigen oder sollte ich lieber ne andere Programmiersprache lernen? 😕

    thx für die mühe!



  • Erstmal Grundlagen lernen.
    Später Windows Programmierung. ^^



  • c++ anfänger _/ schrieb:

    Sollte ich dann als Hobbyprogrammierer eher auf(was die Windowsprogrammierung angeht) doch lieber Delphi, c# oder VB umsteigen?

    Also grundlegend: Jede Sprache hat andere Einstiegshürden, und je nach Sprache ist die Windowsprogrammierung eher früh oder eher spät sinnvoll. In C++ gibt es kein einheitliches UI-Framework wie z.B. in Delphi oder C#, sondern viele Verschiedene. In Delphi und in C# gehört das UI Framework zu der Standardbibliothek - dort ist es eher leichter früher auch Windowsprogrammierung vorzunehmen. Früher, nicht aber unbedingt zu Beginn.

    Grundsätzlich solltest du aber vor komplizierten Windowsprogrammen ein paar Grundlagen der eigentlichen Sprache verstehen und beherrschen. C++ ist sehr mächtig, aber auch sehr umfassend (Komplex kann, aber muss es nicht sein, kommt immer auf den Bereich an) - die Sprache umfassend zu beherrschen erfordert viel Zeit - wobei man einige Bereiche auch erst einmal auslassen kann, und Andere vielleicht niemals für dich relevant werden (Templatemetaprogrammierung ist z.B. ein Bereich von dem man zwar was hört, aber mit Sicherheit von vielen C++ Programmierern außen vor gelassen wird). Anderseits hat C++ auch den großen Vorteil, das man eher die Abläufe versteht (da man mehr händisch machen muss), was teilweise in anderen Sprachen sehr nützlich sein kann.

    c++ anfänger _/ schrieb:

    Also meine Frage an euch, die Ihr wesentlich mehr Erfahrungen in Softwareentwicklung habt, macht es Sinn für einen Anfänger wie mich sich überhaupt mit der Windowsentwicklung unter c++ zu beschäftigen oder sollte ich lieber ne andere Programmiersprache lernen? 😕

    Verkehrt würde ich nicht sagen (schließlich verdiene ich damit auch mein Geld, und kenne viele Unternehmen die mit C++ arbeiten), nur nicht unbedingt Anfängerfreundlich. In C++ rate ich dazu, erst einmal fundierte Grundlagen zu erwerben, bevor man sich mit einer echten UI beschäftigt (Fundiert heißt für mich, das man neben den üblichen Schleifen etc. zumindest die Grundlagen von Templates und Zeigerarithmetik [unabhängig davon was C++ einen Abnehmen kann] versteht, und zumindest einen groben Überblick über die C++ Standardbibliothek besitzt - und dies auch Anwenden kann).

    Und dann sollte man sich erst einmal informieren welches UI-Framework für einen das passende ist (Wie "C++"-artig soll es sein, wie einfach soll es bedienbar sein [Um so komplexer, um so mehr "Feintuning" kann man zumeist machen, dafür muss man sehr viel Code schreiben, wo in anderen Frameworks vielleicht wenige Zeilen reichen],ist Portabilität gewünscht, wie gut soll es sich in das OS integrieren, wieviel soll es abdecken - nur UI oder z.B. auch Datenbanken; muss es kostenlos erhältlich sein, oder ist eine kommerzielle Lizenz auch denkbar...).



  • Ich stimme meinen Vorpostern tendenziell zu.
    Wenn es dir nur um die UI Programmierung geht hast du viele Frameworks die relativ einfach zu benutzen sind, wie QT oder wxWidgets. Das MFC ist wie bereits gesagt meiner Meinung nach etwas veraltet.

    Allerdings finde ich dass es auch nie Schaden kann auch etwas über die Win32 API zu lernen. Zwar nicht um irgendwelche UI's zu programmieren, das wäre finde ich viel zu umständlich damit. Aber durch diese API lernt man sehr gut wie ein Windows Programm arbeitet, was meist bei einem modernem UI-Framework verborgen wird. Wenn du ein richtiger Hacker werden willst lohnt sich das :D.

    Jedenfalls, probier doch einige UI Packages aus bis du eins gefunden hast was dich zufrieden stellt. Wenn es dir besser gefällt deine UI nicht zu programmieren sondern einfach zusammenzuklicken, dann wäre vielleicht C# die bessere Alternative. Bin allerdings auch nicht auf dem neusten Stand was man da mit C++ über .Net mitlerweile machen kann.



  • danke für eure antworten! also ich werde mich dann für ein paar wochen noch mit der konsolenprogrammierung und der c++ std bibliothek befassen :D. Dann komme ich wieder und nerve euch weiter!!! :DD

    aber danach denke ich dass ich zu .net tendiere da ich ja n buch dazu habe 😕 und da kann ich n fenster manuell zusammenbasteln D:.

    thx



  • Max3000 schrieb:

    Bin allerdings auch nicht auf dem neusten Stand was man da mit C++ über .Net mitlerweile machen kann.

    c++ anfänger _/ schrieb:

    aber danach denke ich dass ich zu .net tendiere da ich ja n buch dazu habe 😕 und da kann ich n fenster manuell zusammenbasteln D:.

    C++/CLI hat einige Probleme mit dem .Net Framework, weshalb ich davon abrate. Die Sprache genießt auch bei weiten nicht die Behandlung, wie die anderen .Net-Sprachen.

    Es fehlen Sprachmittel, die das Entwickeln mit C++/CLI gerade in Hinblick auf die aktuell von Microsoft propagierte UI-Bibliothek massiv erschweren (WPF - die alte UI-Bibliothek WinForms wird abgedeckt), ebenso ist die Toolunterstützung für C++/CLI schlechter.

    C++/CLI hat meiner Meinung nach nur einen wirklich guten Existensgrund: Die Interoperation mit Altcode. Nicht mehr und nicht weniger. Wer .Net Programmieren will, sollte wirklich zu einer besser unterstützen Sprache (sei es C# oder VB.Net) greifen.



  • c++ anfänger _/ schrieb:

    moderated

    Es heisst "managed".
    Bitte lern das Vokabular. Ist immer unglaublich nervig wenn Anfänger eigene Wörter erfinden (was sie - auch was für Gründen auch immer - ziemlich oft tun).



  • Also soll ich nachdem ich die Grundlagen beherrsche die Windowsprogrammierung mit MFC anfangen oder? :PP

    Mir genügt ja ein einfaches, nicht höchst-komplexes user-interface für den Anfang. Wie gesagt möchte ich das als Hobby machen und mich vorläufig noch nicht in die tiefsten Tiefen der Sprache einarbeiten, ohne zuvor wenigstens einfache Windowsprogramme schreiben zu können.

    Danke für die Mühe

    @hustebaer :=)
    ist schon verständlich :p. Aber ich als Anfänger weiss es eben noch nicht besser :/.



  • Hier findest du eine Übersicht über GUI-Bibliotheken in C++.

    Zum Beispiel ist VCF relativ unbekannt, aber benutzt verhältnismässig modernes C++ und native Widgets. Modern meine ich z.B. im Vergleich zu wxWidgets. 😉

    <a href= schrieb:

    wxWidgets Style-Guide">1. Don't use C++ templates
    2. Don't use C++ exceptions
    3. Don't use RTTI
    4. Don't use namespaces
    5. Don't use STL
    6. Don't declare variables inside for()
    [...]
    (kurz: Use C with classes :p)



  • Nexus schrieb:

    Hier findest du eine Übersicht über GUI-Bibliotheken in C++.

    Zum Beispiel ist VCF relativ unbekannt, aber benutzt verhältnismässig modernes C++ und native Widgets. Modern meine ich z.B. im Vergleich zu wxWidgets. 😉

    <a href= schrieb:

    wxWidgets Style-Guide">1. Don't use C++ templates
    2. Don't use C++ exceptions
    3. Don't use RTTI
    4. Don't use namespaces
    5. Don't use STL
    6. Don't declare variables inside for()
    [...]
    (kurz: Use C with classes :p)

    Was davon brauchst du für modernes C++ und warum?



  • woooh schrieb:

    Was davon brauchst du für modernes C++ und warum?

    Namespaces um den Code anderer leute nicht mit Bezeichnern zu überfluten, die mit ihrem Code kollidieren? Nur so als Beispiel.



  • otze schrieb:

    woooh schrieb:

    Was davon brauchst du für modernes C++ und warum?

    Namespaces um den Code anderer leute nicht mit Bezeichnern zu überfluten, die mit ihrem Code kollidieren? Nur so als Beispiel.

    Wenn die vor alles wx schreiben dürfte es kaum mit anderen kollidieren. Und vom C with classes zum modernen C++ wird es ja wohl noch nicht weil man alles ein nen Namespace steckt.



  • [quote="woooh"Wenn die vor alles wx schreiben dürfte es kaum mit anderen kollidieren. Und vom C with classes zum modernen C++ wird es ja wohl noch nicht weil man alles ein nen Namespace steckt.[/quote]

    Kürzel für Unterscheidnungen von Klassen verschiedener Bibliothekten zu nehmen, sehe ich als unschön an. Zumal nichts dagegen spricht 2 wx-Bibliothekten irgendwann zu "vereinen". Und dann kannst du wieder Namenskonflikte haben.

    1. Don't use C++ templates
    

    Für bestimmte Mechanismen sind C++ Templates das mittel der Wahl (Policy Based Design etc.). Zudem ist Typsicherheit von Templates sicherlich den Alternativen (Entweder eigene Konstukte für jeden Datentyp, void*...) vorzuziehen.

    2. Don't use C++ exceptions
    3. Don't use RTTI
    

    Beides durchaus gängige und sinnvolle C++ Konstrukte (gerade auch in Kombination).

    4. Don't use namespaces
    

    Wie oben gesagt sind Namesräume deutlich besser als Kürzel geeignet.

    5. Don't use STL
    

    Die STL ist Bestandteil des C++ Standards, und das seit 1998. Das Ausschließen selbiger ist ein Armutszeugnis (zumal in der C++ Standardbibliothek und der STL einige sinnvolle Klassen etc. enthalten sind). Warum alles neu erfinden, oder propritär lösen?

    6. Don't declare variables inside for()
    

    Wiederspricht dem Prinzip alles so lokal wie möglich zu deklarieren.

    Hallo, wir schreiben das Jahr 2010. Der C++ Standard ist von 1998, der TR1 von 2003, der nächste Standard wird vermutlich nächstes Jahr verabschiedet, und selbt für den TR2 steht schon einiges auf der Liste. Die verbreiteten Compiler setzen allesamt inzwischen einen Großteil des Standards um (mit kleinen Ausnahmen zwar, aber vieles kann man als Gegeben betrachten, selbst bei Templates).

    wx ist alles andere als Modern.

    Vieles was in modernen C++ üblich ist (Werf unter anderen mal ein Blick in More C++ Idioms) ist in wx ausgeschlossen.



  • Mit geht es nicht darum wofür die Sachen allgemain da sind, sondern warum man die zu modernem C++ braucht? OK, das mit den Variablen in for ist schon sehr komisch, aber was von den oben genanten Punkten brauchst du für RAII, Copy-and-swap, Safe bool usw. Gerade mal templates sind einigermaßen nützlich für smart pointers, container usw.



  • Nexus schrieb:

    <a href= schrieb:

    wxWidgets Style-Guide">1. Don't use C++ templates
    2. Don't use C++ exceptions
    3. Don't use RTTI
    4. Don't use namespaces
    5. Don't use STL
    6. Don't declare variables inside for()
    [...]
    (kurz: Use C with classes :p)

    Irgendwie zum Schmunzeln 🤡

    Don't use C++ templates
    Besides the reasons mentioned above, template usage also makes the program compile much slower (200%-300% is not uncommon) and their support even in the compilers which have had it for a long time is far from perfect (the best example is probably gcc).

    WTF, die Argumentation ist ja echt ein Hammer.



  • wtfler schrieb:

    Irgendwie zum Schmunzeln 🤡

    Don't use C++ templates
    Besides the reasons mentioned above, template usage also makes the program compile much slower (200%-300% is not uncommon) and their support even in the compilers which have had it for a long time is far from perfect (the best example is probably gcc).

    WTF, die Argumentation ist ja echt ein Hammer.

    Ja, ich würde sagen es braucht 1000%-10000% länger, wenn man richtig viel templates wie boost bind und lambda nimmt.



  • woooh schrieb:

    Mit geht es nicht darum wofür die Sachen allgemain da sind, sondern warum man die zu modernem C++ braucht?

    Weil C++ ohne Templates, Exceptions, Namensräume und STL eben nicht C++ ist. Das sind alles wesentliche Bestandteile der Sprache (die Standardbibliothek gehört dazu).

    woooh schrieb:

    aber was von den oben genanten Punkten brauchst du für RAII, Copy-and-swap, Safe bool usw. Gerade mal templates sind einigermaßen nützlich für smart pointers, container usw.

    Um RAII generisch zu behandeln, kommen oft Templates zum Zug (z.B. die von dir angesprochenen Smart-Pointer oder Container). Davon abgesehen kann man auch sonst viele Probleme sehr elegant mit Templates lösen, und Fehler von der Laufzeit auf die Compilezeit verlagern.

    Eine freie, überladene swap() -Funktion ist essentiell für ADL, ein Abstraktionskonzept von Namensräumen, das Präfixe nicht bieten.

    Die Standard Template Library brauche ich andauernd. Gerade die STL ist ein typisches Beispiel, wie modernes C++ aussehen kann: Dank Templates wird eine Entkopplung von Containern und Algorithmen möglich, wobei Iteratoren das Zwischenstück bilden. Zudem abstrahiert man von Low-Level-Mechanismen wie Zeigerarithmetik und manueller Speicherverwaltung.

    Generell kann man sich mit modernen C++-Errungenschaften von fehleranfälligen Altlasten aus C abwenden. Auch Makros mit ihren Problemen werden oft durch typsichere Alternativen ersetzt.

    wtfler schrieb:

    WTF, die Argumentation ist ja echt ein Hammer.

    Ihre Begründungen sind teilweise wirklich nicht ganz aktuell, hier zum Verzicht auf Exceptions:

    Another reasons not to use it, besides portability, are the performance penalty it imposes (small, but, at least for current compilers, non-zero), and subtle problems with memory/resource deallocation it may create (the place where you'd like to use C++ exceptions most of all are the constructors, but you need to be very careful in order to be able to do it).

    Performance ist im Fehlerfall in der Regel nicht entscheidend, und Exceptionsicherheit wird damit natürlich ein Thema (das mit RAII aber gut zu bewältigen ist).

    Das soll nicht heissen, dass wxWidgets schlecht ist. Es ist mit Sicherheit ein sehr mächtiges Framework, und für GUI gerade eines der wenigen, das native Widgets unterstützt. Aber es ist seiner Zeit eben etwas hinterher. Im Jahr 2010 stimmt es einfach nicht mehr, dass die erwähnten Sprachmittel kaum von Compilern unterstützt werden.

    stimmt schrieb:

    Ja, ich würde sagen es braucht 1000%-10000% länger, wenn man richtig viel templates wie boost bind und lambda nimmt.

    Bind geht noch, aber Lambda verwende ich z.B. auch nicht. Man muss ja auch nicht die Hardcore-Boost-Möglichkeiten nutzen, die quasi neue Sprachmittel emulieren. Aber bereits von Makros zu Templates für generische Container ist ein grosser Schritt.



  • Nexus schrieb:

    woooh schrieb:

    aber was von den oben genanten Punkten brauchst du für RAII, Copy-and-swap, Safe bool usw. Gerade mal templates sind einigermaßen nützlich für smart pointers, container usw.

    Um RAII generisch zu behandeln, kommen oft Templates zum Zug (z.B. die von dir angesprochenen Smart-Pointer oder Container). Davon abgesehen kann man auch sonst viele Probleme sehr elegant mit Templates lösen, und Fehler von der Laufzeit auf die Compilezeit verlagern.

    Eine freie, überladene swap() -Funktion ist essentiell für ADL, ein Abstraktionskonzept von Namensräumen, das Präfixe nicht bieten.

    Die Standard Template Library brauche ich andauernd. Gerade die STL ist ein typisches Beispiel, wie modernes C++ aussehen kann: Dank Templates wird eine Entkopplung von Containern und Algorithmen möglich, wobei Iteratoren das Zwischenstück bilden. Zudem abstrahiert man von Low-Level-Mechanismen wie Zeigerarithmetik und manueller Speicherverwaltung.

    Generell kann man sich mit modernen C++-Errungenschaften von fehleranfälligen Altlasten aus C abwenden. Auch Makros mit ihren Problemen werden oft durch typsichere Alternativen ersetzt.

    Natürlich kann man nicht alles machen, wenn man nicht alles verwendet. Man kann statt mit Generizität vieles auch mit Objektorientierung machen, das ist dann mehr Java oder C# Style, aber von C with classes ist man immer noch weit entfernt. Ich hab das wxWidgets Zeugs noch nie verwendet und es kann sein, dass das C with classes ist.

    Nexus schrieb:

    Exceptionsicherheit wird damit natürlich ein Thema (das mit RAII aber gut zu bewältigen ist).

    Nö da musst du schon mehr aufwand reinstecken, der Destruktor wird garnicht aufgerufen, wenn im Konstruktor eine Exception fliegt.



  • woooh schrieb:

    Man kann statt mit Generizität vieles auch mit Objektorientierung machen, das ist dann mehr Java oder C# Style

    Das ist in C++ nicht ganz so einfach, weil z.B. nicht alle Typen von Object erben und nicht wenige Typen gar keine Klassen sind.

    Wie würdest du std::vector mit dynamischer Polymorphie implementieren, damit man sowohl int als auch eine eigene Klasse MyClass verwenden könnte? Du müsstest auf Typsicherheit verzichten, wie man es in Java vor den Generics getan hat. Du könntest nur Klassen verwenden, die von einer bestimmten Basisklasse abgeleitet sind.

    Wenn man wie wxWidgets Makros für Container verwendet, ist man teilweise sogar flexibler als mit Laufzeitpolymorphie. Weil eben die Typen zur Kompilierzeit bereits feststehen. Dafür hat man andere Nachteile.

    woooh schrieb:

    Nexus schrieb:

    Exceptionsicherheit wird damit natürlich ein Thema (das mit RAII aber gut zu bewältigen ist).

    Nö da musst du schon mehr aufwand reinstecken, der Destruktor wird garnicht aufgerufen, wenn im Konstruktor eine Exception fliegt.

    Nein, musst du nicht. Wieso sollte der Destruktor aufgerufen werden, wenn das Objekt noch nicht fertig konstruiert ist?

    struct MyClass
    {
        A* a;
        B* b;
    
        MyClass() : a(new A), b(new B)
        {
            // wenn der B-Konstruktor wirft, sind wir verloren.
        }
    };
    

    Mit RAII:

    struct MyClass
    {
        scoped_ptr<A> a;
        scoped_ptr<B> b;
    
        MyClass() : a(new A), b(new B)
        {
            // Problem gelöst
        }
    };
    

    Ohne Exceptions hat man im Konstruktor vor allem auch das Problem von anderen Ressourcenanforderungen, da man dem Aufrufer keinen Fehler mitteilen kann. Man müsste entweder in der Klasse ein Valid-Flag mitführen (unschön) oder nachträgliche Init-Funktionen bereitstellen (unschön).


Anmelden zum Antworten