Dev-C++
-
@HumeSikkins:
Danke für die detaillierte Antwort! Du hast absolut Recht mit Deinen Anmerkungen. Die Ausführungen oben stammen aus dem Internet (siehe die entsprechenden Links, nicht gerade Anfänger-Skripte) und vermischen in der Tat einiges miteinander. Das Programmbeispiel ist doch aber anschaulich und verständlich. Ich selbst habe "mutable" bisher noch nie verwendet. Gibt es dafür eine typische Anwendung, die praktisch überzeugend ist?@Elise:
Ich habe nur 12 * 45 Min. für interaktiven on-line-Unterricht, jeweils 4 * 45 Min. und dann jeweils eine Woche Pause, in der dann multiple choice-Fragen und Aufgaben/Übungen bearbeitet werden können, Nachfragen gestellt werden können, usw. Da hast Du wirklich bessere Voraussetzungen mit Deinem Zeitplan. Mein Ziel ist der Übergang zu WinAPI - das geht sicher ideal mit dem Dev-C++ - auf Basis meines Tutorials www.henkessoft.de/api1.htm .
Den C++-Standard kann ich in der kurzen Zeit auf keinen Fall komplett durcharbeiten. Ich möchte aber die "keywords", die im Standard aufgeführt sind, gruppiert als Fahrplan verwenden - die kann man dann immer als bekannt abhaken, das sieht nach schnellem Fortschritt aus - und daher auch mehr oder weniger ausführlich erklären.+--------------------------------------------------------------------------+ |asm do inline short typeid | |auto double int signed typename | |bool dynamic_cast long sizeof union | |break else mutable static unsigned | |case enum namespace static_cast using | |catch explicit new struct virtual | |char extern operator switch void | |class false private template volatile | |const float protected this wchar_t | |const_cast for public throw while | |continue friend register true | |default goto reinterpret_cast try | |delete if return typedef | +--------------------------------------------------------------------------+
Ich verwende dies nicht alphabetisch - wie oben aus dem Standard übernommen - sondern nach Themen gruppiert. Man kann herrlich beginnen mit false und true (das ist ja nur ein anderer Ausdruck für 0 und 1) und damit in das Binärsystem einsteigen, anschließend mit char, wchar_t (-> Unicode kurz vorsstellen), short, int, long, float, double in die vorhandenen Datentypen einsteigen, später mit if, else, while, for, switch, case, default, break, continue, goto ... Kontrollstrukturen erklären, um dann auf Strukturen und Klassen (das ist ja das wichtigste Konzept in C++) überzugehen. Anschließend exceptions, templates usw. Sachen wie mutable gehören auf jeden Fall eher an den Schluß. Das habe ich nach HumeSikkins Beitrag verstanden. Die meisten C++-Tutorials und Bücher erklären die keywords nicht komplett, was ich nicht für richtig halte. Denn das ist sozusagen das Alphabet von C++. Wie seht ihr das?
@all:
Wie kann man die MFC in einen kostenlosen Compiler wie Dev-C++ einbinden? Ich würde auf jeden Fall gerne den Aufbau ohne Assistent zeigen. Wie macht ihr das?
-
sorry, Doppel-Post.
-
erhard, was ist mit der objektorientierung?
vererbung, polymorphie... sowas lernt man nicht mit keywords.
dazu die zeiger, der heap, alles wichtige darum...
etc.. etc.. etc..
mach api vielleicht ganz zum schluß als hinweis auf folgekurse, in denen es um windowsprogrammierung a microsoft gehen soll.
und lass mfc einfach weg.
bibliotheken einbinden und c++ lernen hat erstmal nix miteinander zu tun.ps: ich weiß, es ist schwerer so, weil man den schülers keine bonbons in form von bunten bildchen an die hand geben kann... aber perspektivisch lernen sie das eigentliche, nämlich programmieren. was sollen sie mit einfachen (klick und klack) oberflächen, wenn sie die hintergründe nicht kennen?
-
..
-
vererbung, polymorphie... sowas lernt man nicht mit keywords.
dazu die zeiger, der heap, alles wichtige darum...Ganz klar, das sind die wichtigsten Strukturen von C++, so etwas kann man an solchen Beispielen recht gut erläutern:
//virtuelle Funktionen #include <iostream> using namespace std; class Basisklasse { public: virtual void virt_function() { cout << "Basis sagt Hallo" << endl; }; }; class Kindklasse1 : public Basisklasse { public: void virt_function() { cout << "Kind1 sagt Hallo" << endl; } }; class Kindklasse2 : public Basisklasse { public: void virt_function() { cout << "Kind2 sagt Hallo" << endl; } }; class Enkelklasse1 : public Kindklasse1 { public: void virt_function() { cout << "Enkel1 sagt Hallo" << endl; } }; class Enkelklasse2 : public Kindklasse2 { public: void virt_function() { cout << "Enkel2 sagt Hallo" << endl; } }; int main() { Basisklasse basis; Kindklasse1 kind1; Kindklasse2 kind2; Enkelklasse1 enkel1; Enkelklasse2 enkel2; Basisklasse *pZeiger = &basis; pZeiger->virt_function(); pZeiger = &kind1; pZeiger->virt_function(); pZeiger = &kind2; pZeiger->virt_function(); pZeiger = &enkel1; pZeiger->virt_function(); pZeiger = &enkel2; pZeiger->virt_function(); return 0; }
Dann bringt man noch folgende "Versuche":
In dem vorstehenden Programm wird für jedes Objekt die richtige Version der Funktion virt_function aufgerufen. Bei virtuellen Funktionen entscheidet nicht der Typ des Zeigers, sondern der Typ des Objekts über die verwendete Funktion. Damit klar wird, das dies durch den Bezeichner "virtual" ausgelöst wird, lassen wir ihn im nachfolgenden Beispiel versuchsweise weg:
class Basisklasse { public: /*virtual*/ void virt_function() { cout << "Basis sagt Hallo" << endl; }; };
Nun wird für alle Objekte unabhängig vom Typ immer die Funktion der Basisklasse aufgerufen. Eine „späte Bindung“ in Abhängigkeit vom Objekttyp erfolgt nicht. Ohne virtuelle Funktion gelingt dies nur mit dem richtigen Objekttyp:
int main() { ... basis.virt_function(); kind1.virt_function(); kind2.virt_function(); enkel1.virt_function(); enkel2.virt_function(); return 0; }
... oder mit Zeigern auf die Objekte der jeweils abgeleiteten Klasse:
int main() { ... (&basis)->virt_function(); (&kind1)->virt_function(); (&kind2)->virt_function(); (&enkel1)->virt_function(); (&enkel2)->virt_function(); return 0; }
Da hat man schon alles Wesentliche zu dem Thema in einem einfachem Programm. Wenn man jetzt noch einige Objekte alternativ mit new erzeugt und dann nach der Speicheradresse schaut und delete einsetzt. Vielleicht auch noch ganze Arrays von Kindern und Enkeln, dann kann man gleich delete[] vorführen usw.
-
konzepte gleich am anfang... meiner meinung nach dort noch schwer zu verstehen.
deine lernenden müssen wohl schon erfahrung in programmierung mitbringen.
aber ich kenne das gesamtkonzept nicht. auch nicht das ziel. wohin die leute dann kommen sollen.
kriegen sie einen abschluß? oder ist es einfach nur ein workshop?klar kann man gute programme bieten, und diese erklären.. ich setze den schwerpunkt in den ersten stunden aber eher auf "selber erfahrung sammeln" durch aufgaben, die aufeinander aufbauen und die gelöst werden sollen.
in die "konzepte" wachsen sie nach und nach rein, und daß wahrscheinlich noch lange über den kleinen einmonatskurs hinaus
-
elise schrieb:
kriegen sie einen abschluß?
Welche offiziell anerkannten Abschlüsse kann man denn bei C++ erreichen?
Die Abschlüsse der sgd sind z.B. auch nicht viel wert, wenn es solche comments gibt, hier ein Beispiel C++ unter Linux: http://www.dooyoo.de/dienstleistungen/dienstleistung_div/sgd_studiengemeinschaft_darmstadt/_review/627406/ (da sieht man die Probleme mit der Portabilität ganz deutlich)elise schrieb:
ich setze den schwerpunkt in den ersten stunden aber eher auf "selber erfahrung sammeln" durch aufgaben, die aufeinander aufbauen und die gelöst werden sollen.
Das ist ein guter Hinweis. Ich muss nur klar unterscheiden zwischen leichten Aufgaben, die man direkt im online-Unterricht gemeinsam lösen kann, oder Hausaufgaben, die nicht zu leicht, aber dennoch interessant sein müssen. Das ist das Schwierigste.
-
Hume - die Komprimierung Deiner Anmerkungen ist extrem hoch. Das wird Stunden dauern, bis ich die entzippt habe. Ich weiß, sie galten eher Erhard - einem armen Kursteilnehmer sollte man sie nicht vorsetzen, der springt aus dem Fenster.
Deswegen schreibe ich keine Tutorials, gebe keine Kurse, habe meine FAQs eingestellt und deshalb verkneife ich mir mittlerweile auch die meisten Erklärungsversuche in diesem Forum. Will schließlich nicht für den Tod irgend eines Mitmenschen verantwortlich sein
Meine kurzen Anmerkungen waren auch nicht als Erklärung gedacht. Ich denke nur, dass es manchmal sinnvoller ist ein Thema gar nicht zu behandeln (hier mutable) als zu durchwachsen.
Das Programmbeispiel ist doch aber anschaulich und verständlich
Ich halte das Programmbeispiel weder für anschaulich noch für verständlich. Für anschaulich und verständlich ist es meiner Meinung nach zu kurz und viel zu "künstlich". Dazu ist es auch noch furchtbar schlechter Stil.
Meiner Meinung nach kann und sollte man den Sinn von mutable nicht losgelöst erklären. mutable macht nur Sinn, wenn man bereits ein gewisses Verständnis für const hat. Und zwar sowohl für die Unterschiede zwischen einem const-Objekt vs. eine Referenz (ein Pointer)-auf-const sowie für die zwischen einer "normalen" und einer const-deklarierten Methode.
Davor ist mutable einfach nur bla.Gibt es dafür eine typische Anwendung, die praktisch überzeugend ist?
Sicher. Und ich muss sagen, dass ich mein Caching-Beispiel nach wie vor überzeugend finde. Natürlich nur unter Berücksichtigung der oberen Vorbedingung.
Die meisten C++-Tutorials und Bücher erklären die keywords nicht komplett, was ich nicht für richtig halte. Denn das ist sozusagen das Alphabet von C++. Wie seht ihr das?
Ich halte Konzepte für deutlich wichtiger als Keywords. Lieber ein C++ Programmierer, der das register-Keyword nicht kennt, als einer, der nicht die Konsequenzen von öffentlichen Instanzvariablen verstanden hat.
OOP ist einfach zu vermitteln, das hängt natürlich an der Klasse als Kernkonzept von OO-Sprachen wie C++.
Einige (z.B. James Coplien: http://www.artima.com/weblogs/viewpost.jsp?thread=6771) behaupten ja, dass hier genau das Problem bei vielen OO-Einführungen liegt. Nicht die Klasse ist das Kernelement der oo sondern das Objekt. Heißt ja schließlich *objekt*-orientiert.
Klar ist es für viele fein immer schön alles in statische Hierarchien einzuordnen. Nur die machen erstmal gar nichts. Vorallem wenn man nicht weiß, wo später die Objekte herkommen und wie diese miteinander interagieren.Aber mal unabhängig davon. Das OO einfach zu vermitteln ist, halte ich für eine grobe Fehleinschätzung. Man kann vielleicht in einem vier-Wochen Kurs die Grundgedanken von Klassen, Polymorphie und Vererbung lehren, aber das war's dann auch. Ein Verständnis für gutes objektorientiertes Design wird man mit Sicherheit aber nicht in dieser Zeit aufbauen können.
Ganz klar, das sind die wichtigsten Strukturen von C++, so etwas kann man an solchen Beispielen recht gut erläutern:
Damit erklärst du gerade mal die Funktionsweise des virtual-Keywords, und damit der späten Bindung, in C++. Verständnis für das eigentlich Konzept kann man damit imo aber nicht lernen.
-
Erhard, ich glaube du beherrscht C++ garnicht gut genug, um darüber Kurse zu halten.
-
Das lassen wir mal schön die Schüler entscheiden, die dürfen von 1-10 bewerten.
-
@HumeSikkins: da Du mein "virtual"-Beispiel nicht völlig zertrampelst, scheint es o.k. zu sein.
Ansonsten hast Du mit Deinen Aussagen absolut Recht. Das didaktische Gefühl für Einsteiger scheinst Du aber verloren zu haben. Eigentlich schade, denn Deine Homepage und Deine Antworten sind hervorragend und hilfreich, wenn auch nicht in direktem Sinne.
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=constcor#Answ
kann man dem geneigten Leser zum Thema const-correctness nur empfehlen.
-
Das didaktische Gefühl für Einsteiger scheinst Du aber verloren zu haben
Ich denke ich hatte bisher nie ein Gefühl für Didaktik. Mein Ziel ist es aber, in den nächsten Jahren das Level des Einsteigers zu verlassen um mich dann im Bereich Didaktik für Einsteiger verbessern zu können.
Richtig ist aber, dass mir die Fähigkeit fehlt das Wichtige vom weniger Wichtigen zu unterscheiden.
Hm, aber das ist natürlich überhaupt nicht Thema dieses Threads, also schnell zurück zu den inhaltlichen Sachen
-
@HumeSikkins: Ich finde, dass gute Beispiele didaktisch wichtiger sind als Konzepte. Das Buch von Marc++us ist z.B. deshalb so lesenswert, weil er knappe Statements und viele Beispiele bringt, noch dazu gewürzt mit Humor. Ein Konzept habe ich in dem Buch bisher noch nicht gefunden, aber das macht überhaupt nichts. "mutable" findet man im Sachregister zumindest nicht.
Welche GUI würdest Du auf C++ aufsetzen (möglichst passend zum Dev-C++)? Man kann die Leute doch nicht mit weiß auf schwarz (oder umgekehrt) hängen lassen.
-
Wenn Du die Leute nicht mit zusätzlichen GUI-Dingen zu stark belasten willst, und ausserdem noch betriebssystemunabhängig bleiben willst, pack Allegro drauf. Das mag zwar für Dich mit dem Einrichten erstmal ein wenig quälend sein, aber es ist dann sehr einfach zu handhaben - da in C gehalten. Es hat eine kleine GUI drin, die Du dann vielleicht mit ein paar vorgefertigten Funktionen in einer Extra-Datei noch ein wenig hübscher machen kannst. Mit Fenstertechnik etc. ist zwar nichts, aber Alarmboxen, ein Fileselector und ein paar Gadgets, sowie eine Menüleiste sind drin. Jedenfalls musst Du Dich selbst nicht zu intensiv damit beschäftigen, um es nachher rüberzubringen.
Sample+Sourcen für alles sind mit dabei. Zum Lernen ideal finde ich - man hat später höchstens Probleme auf berühmtere Dinge umzusteigen weil man sich damit eigentlich wohl (und gut bestückt) fühlt. Mankos halt in Fenstertechnik und im 3D-Gfx-Hardwarebereich, aber da willst Du wohl nicht hin.
http://www.sunsite.dk/allegro
(Ausserdem kannst Du den Leuten dann mal kurz die Problematik aufzeigen, dass unter der z-Taste nicht unbedingt ein z sein muss, es ist sehr hardwarenah).
-
Erhard Henkes schrieb:
Das lassen wir mal schön die Schüler entscheiden, die dürfen von 1-10 bewerten.
Die werden es ja wohl leider nicht bemerken, ob du ihnen Mist erzählst.
-
@erhard
dein beispiel zur polymorphie wäre mir viel zu akademisch.
versuche mal, ein beispiel mit konkretem inhaltlichen nutzen zu formulieren.
schau einfach, daß die lerndenden durch die beispiele selber auch die grundlegenden konzepte verstehen, nicht nur technisch, wie in deiner einfachanwendung, sondern inhaltlich.
überlege dir dazu, wann du wirklich polymorphie im real life verwendest und formuliere daraus eine schönes einfaches beispiel. dann haben sie die chance, einen ersten einblick in diese "idee" von programmierung zu bekommen. ansonsten ist es geschenkt, techniks kann man nachlesen, zu konzepten muss man -wie auch immer- hingeführt werden.du bist sicher ein guter lehrer. spätestens, wenn du vor der klasse, dem seminar oder sonstwas stehst, wirst du in den erklärmodus umschalten und dann am ersten abend alle deine überlegungen zur didaktik in die ecke werfen, und neu formulieren... und dann super werden. warum? weil du total genau bist, und klar im denken.
didaktik ist nur eine struktur, ein system, nachdem du deine kurse strukturierst,.. klar, die struktur muss stimmen, wie in der programmierung, und manchmal, wenn du gut bist, kannst du ein wenig abweichen, umwege machen, um aber immer wieder zurückzufinden auf deinen pfad.
sicher nie falsch, sich in sowas zu üben, braucht man überall, jeder vortrag muss so aufgebaut sein, jede projektvorstellung
-
@erhard
ach ja, zur bunti klick welt:
lass die api draußen, du wirst so auch schon genug zu tun haben.
versuche lieber, anregende beispiele als aufgaben zu finden. halte dich an volkard, der ist immer gut für tolle ideen.
-
jo, lass den gui mist raus. du brauchst keine konkurenz für den java kurs sein.
bei java ist es irgendwie anderes. da gibt es eigentlich in jedem einsteigerbuch kapitel über gui, threads etc.
in den c++ einsteigerbüchern ist sowas aber fast nie vorhanden.
-
Das Buch von Marc++us ist z.B. deshalb so lesenswert, weil er knappe Statements und viele Beispiele bringt, noch dazu gewürzt mit Humor. Ein Konzept habe ich in dem Buch bisher noch nicht gefunden, aber das macht überhaupt nichts.
Ich glaube wir belegen das Wort "Konzept" mit unterschiedliechen Bedeutungen. Ich bezog mich auf softwaretechnische Konzepte. Und davon zeigt Marcus in seinem Buch eine ganze Menge. Das MVC-Beispiel (Gras-Schaf-Wolf) finde ich z.B. ganz große klasse. Die Prinzipien werden klar, obwohl Marcus auf kompliziertes GUI-gehampel verzichtet. Eine solche hätte wahrscheinlich zwar mehr Mädels gebracht, dafür aber auch vom Wesentlichen abgelenkt.
Ich würde deshalb ebenfalls auf GUI verzichten. Wenn würde ich eher die dafür aus Sicht des Softwareentwicklers wichtigsten Konzepte behandeln. Nachrichten-Schleifen, Publisher-/Subscriber-Techniken, programming by difference (->Polymorphie) usw.
Ansonsten musst du gleich auch noch was über Benutzerschnittstellen-Design machen oder du wirst die Verantwortung dafür tragen müssen, dass wieder unzählige Benutzer mit furchtbaren Oberflächen gequält werdenVorallem würde ich aber ein ausführliches Kapitel über Templates (statische Polymorphie, Traits, Policies) und die STL (doppelt wichtig!) einbauen.
Das man die Standardbibliothek kennen und nutzen können muss, sollte klar sein.
Und die Vermischung verschiedener Paradigmen ist eine besondere Stärke von C++. Wenn man C++ einfach nur auf eine oo-Sprache reduziert, hat man zwar immer noch ein besseres Java (:)), aber man verliert eine Menge Möglichkeiten.
-
HumeSikkins schrieb:
Das MVC-Beispiel (Gras-Schaf-Wolf) finde ich z.B. ganz große klasse. Die Prinzipien werden klar, obwohl Marcus auf kompliziertes GUI-gehampel verzichtet. Eine solche hätte wahrscheinlich zwar mehr Mädels gebracht, dafür aber auch vom Wesentlichen abgelenkt.
hallo?? hume, duck dich