Dev-C++
-
mady schrieb:
Also ich habe ein eigenes Skript
kannst du es online stellen?
-
Anonymous schrieb:
mady schrieb:
Also ich habe ein eigenes Skript
kannst du es online stellen?
Nein - das darf ich von meiner Firma aus nicht... leider.
-
@erhard
ich empfehle bei anfängerkursen erstmal keine bücher zu kaufen, und bringe aber der zweiten woche immer wieder mal eins mit und erläutere vor und nachteile des buchs.
viele menschen viele geschmäcker... es ist schwer, da was zu empfehlen, alleine der sprachstil ist oft wichtig, ob einem ein buch was bringt.
sie können dann mal reinlesen.. ansonsten geh ich nach meinem skript vor (wie mady), und die teilnehmerInnen schreiben mit.
so lassen sie sich ein wenig zeit beim kauf von teuren standardwerken.. ich empfehle darüber hinaus die bibliotheken, der stroustrup ist immer da zu finden
-
Es gibt ja die reservierten keywords in C++. Wie bringt ihr z.B. die Speicherklassen ( auto, static, extern, register, mutable) von Variablen rüber? Geht ihr überhaupt darauf ein?
-
Du solltest auf jeden Fall bis zu einem kleinen Mehrdateienprojekt kommen (und zur Abschreckung auch mal ein richtiges makefile zeigen). Dazu finde ich dann die Speicherklassen extrem wichtig. Mach vielleicht eine Liste über alle Keywords und gehe auf so Dinge wie auto und register nur ganz kurz ein, damit es mal erwähnt wurde, praktisch spielen diese Keywords ja keine Rolle mehr. Wäre auch nicht verkehrt an der Stelle zu erwähnen, dass verschiedene Compiler eventuell noch lokale Spracherweiterungen haben und weitere keywords mitliefern können (unter der Rubrik 'was es sonst noch alles gibt'), aber das sollte dann schon reichen. static, extern ist klar, mutable müsste ich jetzt ehrlich gesagt selbst nachsehen - volatile könnte wichtig sein für's debuggen. Zu erklären, dass einem der Compiler eine Variable wegoptimieren kann, sollte gut dafür sein, ein Gefühl dafür zu bekommen, wie alles funktioniert.
Natürlich ist es schwer, einem puren Anfänger ein Gefühl hierfür zu geben, und es wird ihn erstmal mehr erschrecken, als dass es ihm helfen wird. Aber wenn möglich, würde ich eine Extrastunde unter dem Titel 'wie es weiter geht' für die wirklich Interessierten und Talentierten dazu geben.
-
zu mutable:
http://fara.cs.uni-potsdam.de/~kaufmann//faqs/constcor.pdf
und aus http://www.aoenterprises.de/weiterbildung/tagebuch/hauptteil_faqs_c_plusplus.html#volatileDatentypen
Was bedeutet das Wort mutable?
Nachdem eine Instanz einer Klasse als const deklariert wurde, können die Instanzvariablen von außen nicht mehr verändert werden, auch dann nicht, wenn sie als public deklariert wurden.
Um diese allumfassende Konstantenerklärung für einige Datenelemente aufzuheben, kann mutable verwendet werden.
class Demo{ public: int i; mutable int k; ..... }; void main (void) { Demo d2; d2.i=4; // o.k. da Instanz d2 nicht als const erklärt d2.n=18; // o.k., da egal ob d2 konstant ist oder nicht, mutable Deklaration const Demo d1; d1.i = 4; //--> Fehler, Zugriff nicht gestattet d1.n = 100; // o.k. Zugriff gestattet, da als mutable deklariert. ..... }
Beachte:
Alle Datenelemente einer const-Instanz können nach wie vor über die Methoden der Klasse verändert werden.
mutable kann nicht auf Datenelemente angewandt werden, die als static oder const deklariert worden sind.
Instanzvariablen, die als mutable deklariert worden sind, können auch von const-Methoden der Klasse verändert werden (was normalerweise ohne mutable-Deklaration nicht möglich ist !!!).
Ein Zeiger auf ein const-Element ist selbst nicht konstant. Daher ist folgendes erlaubt:class Demo { public: mutable const int *ptr; .... };
jedoch nicht:
class Demo { public: mutable int* const ptr; ..... };
-
kommt auf deine zeit an, erhard..
ich unterrichte einen monat lang jeden tag 7 stunden, aber dadurch, daß sie nun jeden tag dran sind, fehlt auch zeit zum setzen lassen.
damit muss ich viel zeit für übungen geben. selber drauf kommen ist das a und o, debuggen lernen, eigenen code tippen, tippen, tippen..
wenn du einmal in der woche zwei stunden hast, sieht die sache anders aus, da gibt es zeit zwischen zum setzen und selber rumprobieren.
je nach unterrichtsform.
static gibts ... klar, den rest auf anfrage bei projekten..
in 4 wochen den standard durchzumachen ist hart, aber zu schaffen (aus der stl nur vector, ein minitemplate und string)aber überforderung istes allemal
-
Nachdem eine Instanz einer Klasse als const deklariert wurde, können die Instanzvariablen von außen nicht mehr verändert werden, auch dann nicht, wenn sie als public deklariert wurden.
Verwirrend und ungenau. mutable und acces-specifier sind zwei völlig unabhängige Konzepte.
Alle Datenelemente einer const-Instanz können nach wie vor über die Methoden der Klasse verändert werden
Käse. Ist das Objekt const, können a) nur const-deklarierte Methoden aufegrufen werden und b) führt die Änderung eine nicht-mutable Instanzvariable eines const-Objekts zu undefiniertem Verhalten.
mutable kann nicht auf Datenelemente angewandt werden, die als static oder const deklariert worden sind.
Was direkt aus der Bedeutung von static, const und mutable folgt.
Instanzvariablen, die als mutable deklariert worden sind, können auch von const-Methoden der Klasse verändert werden (was normalerweise ohne mutable-Deklaration nicht möglich ist !!!).
Ungenau. Eine const-Methode kann auch nicht-mutable Instanzvariablen ändern, sofern das referenzierte Objekt nicht konstant ist.
Das ist natürlich nur sinnvoll, wenn die zu ändernde Instanzvariable a) nicht zum logischen Zustand des Objekts gehört und b) der Entwickler oder der Compiler nicht mit mutable vertraut ist -> Stichwort: const_cast.
-
da ich unter b) fallen würde und mich momentan wie ein Kursteilnehmer fühle, muss ich jetzt sagen, dass Erhard's Antwort vielleicht nicht ganz korrekt war, aber verständlich
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.
-
@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.