Wie würdet ihr das Buch bewerten?
-
Hi, ich habe mir vor einem Jahr ein C++ Grundlagen Buch zugelegt. Ich programmiere auch schon Spiele usw. das ist aber unwichtig. Das Problem ist, dass ich mich ein bisschen verarscht fühle.
Ich habe das Buch komplett durch und alles verstanden und kann es auch anwenden, nur es gibt da gewisse Bereiche, mit denen ich mich nicht auskenne.
Wie würdet ihr ein Buch bewerten, wenn ich nach dem Buch keinerlei wissen habe, was mit folgenden Bereichen zu tun hat:
- Was ist der unterschied zwischen dynamic_cast, reinterpret_cast und static_cast?
==> Warum sollte ich nicht im C-Stil casten? Der Autor meint nur: "Casten im C-Stil sollte vermieden werden. Die Erklärung ist für uns im Moment noch nicht von Belang, deswegen werden wir uns damit nicht auseinander setzen"-Wie benutze ich friend Klassen?
-Wo ist der unterschied zwischen WORD, DWORD?
-Was bewirken die Operatoren: &, |, ^ ?
-Zu Visual C++ Compilern: "Der Compiler hat bei dem Schlüsselwort inline letzte Wort, ob er die Funktion inline macht." (Wann / wo / wie?) Auch bei _forceinline / __forceinline hat der Compiler das letzte Wort. (>>Welches?! Und wann?!)
-Was sind _ und __ vor Befehlen?
-Warum sind globale Variablen böse, wenn ich zur Laufzeit bestimmen will, ob mehrere Instanzen einer Klasse erstellt werden sollen? Da brauche ich doch einen globalen Vektor?
-usw.
Wie gesagt: Das ist ein Grundlagenbuch, aber ich finde manche Bereiche sind sehr wichtig und sollten nicht außer Acht gelassen werden oder? Es gibt zwar genug Diskussionen um die verschiedenen Bereiche, aber die Diskussionen sind für mich schwer zu verstehen, weil dann noch größere (für mich noch unbekannte) Bereiche angesprochen werden.
Sind das Informationen, die in einem Buch enthalten sein sollten oder sollte ich mir diese über das Internet beschaffen? Denn früher gabs auch noch nicht so eine riesige Ansammlung und irgendjemand muss diese Themen doch über ein Buch vermitteln.mfg HilfLoseS
-
HilfLoseS schrieb:
- Was ist der unterschied zwischen dynamic_cast, reinterpret_cast und static_cast?
google?
==> Warum sollte ich nicht im C-Stil casten? Der Autor meint nur: "Casten im C-Stil sollte vermieden werden. Die Erklärung ist für uns im Moment noch nicht von Belang, deswegen werden wir uns damit nicht auseinander setzen"
ach...das ist so ein tick von manchen menschen. die c++-casts können dir manchmal mehr sicherheit geben, mit den C-casts kannst du so ziemlich "alles" anstellen (sehr nützlich für so manchen hack und treiber- bzw. hardware nahe programmierung).
die c++- dienen m.E. nach dazu, selbst-kommentierenden code zu schreiben, so dass man sich als coder gedanken darüber macht. sprich static_cast<> = normaler cast; mit dynamic_cast kannst du überprüfen, ob ein cast fehl schlägt.
mit reinterpret_cast kannst du explizit sagen "ich will es!".
aber dazu auch wieder mehr: google;-Wie benutze ich friend Klassen?
ich empfehle dir, artikel und tutorial zu lesen, die sich nicht mit der verwendung, sondern mit der vermeidung mit diesem konzept befasst.
sozusagen "anti-learning" *G*-Wo ist der unterschied zwischen WORD, DWORD?
siehe MSDN bzw. "windef.h" bzw. google; wikipedia kann dir hier auch weiterhelfen. das sind windows-spezifische typedefs, WORD ist, wenn ich mich recht erinnere als 16-bit und DWORD als 32-bit wert definiert, aber ohne gewähr.
[/quote]-Was bewirken die Operatoren: &, |, ^ ?
das sind bitoperatoren. da gibts auch viel bei google und wikipedia.
hier hilft vorallem ausprobieren.-Zu Visual C++ Compilern: "Der Compiler hat bei dem Schlüsselwort inline letzte Wort, ob er die Funktion inline macht." (Wann / wo / wie?) Auch bei _forceinline / __forceinline hat der Compiler das letzte Wort. (>>Welches?! Und wann?!)
infos zu VC++ gibts in der MSDN.
-Was sind _ und __ vor Befehlen?
meistens werden mit diesen beiden präfixen compiler-/plattformspezifische konstanten/macros/funktionen/keywords gekennzeichnet.
Warum sind globale Variablen böse, wenn ich zur Laufzeit bestimmen will, ob mehrere Instanzen einer Klasse erstellt werden sollen? Da brauche ich doch einen globalen Vektor?
soo böse sind sie auch nicht, kommt immer drauf an. meistens gehts schöner, nicht immer, meistens lässt sich ein OO design pattern ein schönerer, wartbarerer code bauen.
ich würde sagen, zu allen fragen, die du hast, gibt es Artikel und Tutorials zu Hauf im Internet, also bei kleinen Unsicherheiten oder wenn du auf etwas neues gestoßen bist: Einfach mal google bemühen, da findest du schneller antworten, als wenn dir das hier jemand beantwortet *G*
grüße, xantus
-
HilfLoseS schrieb:
Ich habe das Buch komplett durch und alles verstanden und kann es auch anwenden, nur es gibt da gewisse Bereiche, mit denen ich mich nicht auskenne.
Wie würdet ihr ein Buch bewerten, wenn ich nach dem Buch keinerlei wissen habe, was mit folgenden Bereichen zu tun hat:
Ganz ehrlich, das macht das Buch beileibe nicht schlecht. Ich kenne kein Buch das alleine ausreicht um wirklich alle Grundlagen von C++ zu beherrschen, zumal du teilweise Dinge erwähnst die noch nicht einmal ANSI C++ sind (WORD, DWORD, _forceinline / __forceinline...).
Mir scheint es auch kein Grundlagenbuch zu sein, da ich in einen Grundlagenbuch über C++ keine GUI-Programmierung erwarte. Die GUI würde ich immer in ein separates Buch auslagern, da es in C++ keine Standard-GUI gibt.
Wenn der Autor dir wirklich alle Bereiche genau erklären wollte könntest du das Buch wohl kaum noch in der Hand halten xD
Ich sehe auch keinen Nachteil bestimmte Bereiche näher zu erläutern. Man muss nicht Anfänger mit unnötigen Balast (z.B. das Warum bei C++ vs. C-Casts) überfrachten, vielmehr reicht es zu sagen das es sich in der Praxis als der bessere Weg herausgestellt hat. Falls sich jemand wirklich für das Warum interessiert kann er sich immer noch weiterführende Literatur zulegen (z.B. die Exceptional-Reihe von Herb Sutter und die Effective-Reihe von Scott Meyers).
cu André
-
==> Warum sollte ich nicht im C-Stil casten? Der Autor meint nur: "Casten im C-Stil sollte vermieden werden. Die Erklärung ist für uns im Moment noch nicht von Belang, deswegen werden wir uns damit nicht auseinander setzen"
ach...das ist so ein tick von manchen menschen. die c++-casts können dir manchmal mehr sicherheit geben, mit den C-casts kannst du so ziemlich "alles" anstellen (sehr nützlich für so manchen hack und treiber- bzw. hardware nahe programmierung).[/qoute]
Hier sei angemerkt, das selbst ein Hack kein Grund ist, ein C Cast zu verwenden. Diese Dienstleistung bietet Dir der reinterpret_cast an.
xyz_cast<typ>(wert) fällt sehr schnell ins Auge während runde Klammerungen schnell in Funktionsaufrufen untergehen. Zudem lässt sich, wie schon gesagt, der Cast steuern. Der Compiler kann durch den Cast selbst Meldungen liefern und vor falschen Ergebnissen warnen.
Warum sind globale Variablen böse, wenn ich zur Laufzeit bestimmen will, ob mehrere Instanzen einer Klasse erstellt werden sollen? Da brauche ich doch einen globalen Vektor?
soo böse sind sie auch nicht, kommt immer drauf an. meistens gehts schöner, nicht immer, meistens lässt sich ein OO design pattern ein schönerer, wartbarerer code bauen.
[/quote]
Vllt. sollte man globale Variablen nicht mit dem Licht des unschön seins beleuchten sondern mit einem wirklichen Problem:
Globale Variablen sind aus jeder Stelle Deines Codes modifizierbar. Es kann Dir jederzeit passieren, das sich der Wert der Variablen ändert. Muss die Variable dann noch über mehrere Objekte (linker) verteilt werden, wird das Schlüsselwort export sehr wichtig. Globale Variablen sind zwar manchmal ein Weg ein Fehldesign ohne großen Aufwand ans laufen zu bekommen, wird aber zunehmend zum Risiko des undefinierten Verhaltens.
-
Und gelegentlich sind globale Variablen auch einfach notwendig.
-
Tim schrieb:
Und gelegentlich sind globale Variablen auch einfach notwendig.
Aber sehr selten. Ich habe selbst noch nie globale Variablen benötigt, und verwenden tue ich allerhöchsten eine globales Applicationsobjekt, wenn dieses vom Framework bereitgestellt wird.
cu André
-
Tim schrieb:
Und gelegentlich sind globale Variablen auch einfach notwendig.
könnte man sowas nicht über ein statisches Objekt (besser) lösen?
-
Thx für eure Antworten. Mir war irgendwie klar, dass da wieder google und wikipedia etc. kommt, aber zurecht. Ich meinte nur, dass hier sehr viele Diskussionen um bestimmte Themen kommen, bei denen ich einfach nicht mehr mitkomme und ich finde doch enorm wichtig den Unterschied zwischen (bösem und nicht bösem) C-Casting zu wissen. Außerdem erwähnt der Author öfters DWORD und WORD, meint aber, dass die Erklärung nicht notwendig ist. Es ist doch merkwürdig, wenn der Author meint, etwas >>behaupten<< zu müssen, obwohl er dann immer sagt: "Warum das so ist, klären wir nicht". Naja gut
Ach ja, ne Frage zu den bösen Globalen Variablen. Sagen wir, ich erstelle ein (GUI) Fenster in der WinMain. Da erstellt man die Instanz hInstance von HINSTANCE. Was mache ich aber, wenn ich in der CALLBACK Funktion (wo die Messages verarbeitet werden), die hInstance Instanz brauche? Da muss ich doch im Glob. Gültigkeitsbereich HINSTANCE hInstance; schreiben, damit diese auch weiterhin gültig ist. Denn die CALLBACK-Funktion hat nur die Parameter (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam).
Wie könnte man das lösen? Denn im Grunde sehe ich es auch nicht gerne, Globale Variablen zu benutzen. Macht den Code >>irgendwie<< unübersichtlicher!
mfg HilFloseS
-
Hi. Nach Deinen Äußerungen vermute ich einfach mal, dass es sich um ein Buch der Art "Visual C++ in XY Tagen" oder "Visual C++ für Idioten" oder so handelt. Die Betonung liegt hierbei auf "Visual". Falls es so ein Buch ist, war einfach Deine Erwartungshaltung an dieses Buch völlig falsch. In solchen Büchern geht es um die IDE und um MS-spezifische Dinge. Es geht nicht in erster Linie um C++. Ob das Buch in diesem Fall schlecht ist, kann ich nicht beurteilen. Aber ich kann Dir eins sagen: Ich habe zu meiner Schulzeit mal ein oder zwei Bücher mit derartigen Titeln gekauft. Und das war ein Fehler, den ich nie wieder machen werde.
Falls das Buch kein "Visual" oder ähnliches im Titel stehen hat, dann ist es definitiv ein schlechtes Buch. In dem Fall muss man davon ausgehen, dass der Autor selbst nicht weiß, was die Grundlagen von C++ ausmacht. Sonst würde er nicht herstellerspezifische Aspekte thematisieren.
-
Nimm OOP für Dummies
-
HilfLoseS schrieb:
Sagen wir, ich erstelle ein (GUI) Fenster in der WinMain. Da erstellt man die Instanz hInstance von HINSTANCE. Was mache ich aber, wenn ich in der CALLBACK Funktion (wo die Messages verarbeitet werden), die hInstance Instanz brauche? Da muss ich doch im Glob. Gültigkeitsbereich HINSTANCE hInstance; schreiben, damit diese auch weiterhin gültig ist. Denn die CALLBACK-Funktion hat nur die Parameter (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam).
Wie könnte man das lösen?
Das ist in der Tat ein schwieriger Fall, aber ein gravierender Nachteil bei einer globalen HINSTANCE: Sie kann von überall (auch ausversehen) verändert werden -> nix gut. Man bräuchte also ein read-only-Objekt, dass die Instance zurückgibt und nirgendwo außer in der WinMain gesetzt werden darf.
Eventuell so (leider etwas umständlich):
class InstanceHolder { public: static HINSTANCE getInstance() { assert(inst!=NULL); return inst; } static void initializeInstance( HINSTANCE i ) { if(inst==NULL) inst=i; } private: static HINSTANCE inst; }; HINSTANCE InstanceHolder::inst = 0; int WinMain( ... HINSTANCE instance ... ) { InstanceHolder.initializeInstance( instance ); }
Aber vielleicht hat ja jemand eine bessere Lösung für dieses Problem.