Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

31

03.01.2012, 22:31

Was schlägt ihr mir vor, soll ich das Kapitel 10 durcharbeiten oder es überspringen?
Das Kapitel trägt den Titel Windowsprogrammierung.
Only God can judge me.

32

03.01.2012, 23:52

Lass es weg.
Gib zig Bibliotheken wo du dir das a) einfacher zusammenbauen kannst und b) dir selbst beibringen kannst.
Zumal ich finde, dass das Kapitel nicht so ist, was man hätte herausholen können.
Die Entscheidung ist letztlich bei dir. ;)

Singletons waren aber in 8, wenn ich mich nicht irre...? Bin jetzt zu faul zum Gucken.

MfG
Check

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

33

03.01.2012, 23:55

Das musst du selbst entscheiden, es kommt ganz darauf an, was dich interessiert bzw. für was du programmieren möchtest. Du brauchst nicht unbedingt Grundlagen in der Windowsprogrammierung, um mit einigen Frameworks arbeiten zu können, jedoch schadet es nie, zu verstehen, was im Hintergrund passiert. Außerdem ist es nicht schlecht, Funktionen der WinAPI verstehen und nutzen zu können, wenn man explizit für Windows programmiert (muss aber nicht sein, da es Alternativen gibt).

spark

Frischling

Beiträge: 10

Wohnort: Ulm

Beruf: Code Monkey.

  • Private Nachricht senden

34

04.01.2012, 08:08

Früher oder später findet jeder raus warum man um Singletons einen großen Bogen machen sollte ;)

Das finde ich ein bisschen pessimistisch.
Ich habe hier einen Firefox, klicke auf Hilfe->"Über Firefox", da kommt so n Fenster mit ner Version. Ich mach das nochmal, und es erscheint kein zweites Fenster. Das ist doch mal ein klassischer Anwendungsfall für ein Singleton.
Oder eine Konfigurationsklasse, die bei der ersten Verwendung initialisiert wird, und später per Singeton von überall aus verwendet werden kann, ohne jedesmal neu initialisiert werden zu müssen, und ohne alle Interfaces aufzublähen, weil Pointer weitergegeben werden müssen. Und vor allem: ohne dass irgend ein Progger (und sei ich es selbst in einem Anfall geistiger Umnachtung) eine zweite Konfigurationsklasse erzeugt, lustig Werte ändert, und sich wundert, warum sich die Änderungen nur auf einen Teil des Codes auswirkten. (Vorausgesetzt ich weil genau *eine* Konfigurationsklasse in meinem Programm verwenden)

Ich mach z.T. sogar solche Sachen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
class CConfig {
...
// ich spar mir mal den überflüssigen Code...
// CConfig ist ein Singelton!
    static CConfig *instance();

   int get_antizap_range();
}

#define ANTI_ZAP_RANGE CConfig::instance()->get_antizap_range()


So kann ich ANTI_ZAP_RANGE wie ein define verwenden.
Ich könnte auch jedesmal CConfig::instance()->get_antizap_range() schreiben, aber dann werden die Ifs immer so lang und unleserlich....
Ein Herz für die Singletons! :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

35

04.01.2012, 08:41

Früher oder später findet jeder raus warum man um Singletons einen großen Bogen machen sollte ;)

Das finde ich ein bisschen pessimistisch.
Ich habe hier einen Firefox, klicke auf Hilfe->"Über Firefox", da kommt so n Fenster mit ner Version. Ich mach das nochmal, und es erscheint kein zweites Fenster. Das ist doch mal ein klassischer Anwendungsfall für ein Singleton.

Nein, falsch.

Auch das Beispiel mit Deiner Config ist ganz schlecht. Man stelle sich nun vor, dass die Anwendung plötzlich Plugins bekommen soll und jedes Plugin seine eigene Config braucht. Schon geht das Theater wieder los. Singletons sind für diese Config absolut nicht die korrekte Lösung!
Das einzige Argument, was ich bei Dir sehe, welches angeblich FÜR Configs als Singleton spricht, ist Faulheit die Interfaces korrekt zu erweitern und zu übergeben. Das ist nicht die Idee hinter einem Singleton. Klassen müssen dann Singletons sein, wenn es auf gar keinen Fall mehr als eine Instanz geben DARF. Bei Configs sehe ich das aber überhaupt nicht. Genauso gut ließe sich das über Dependency Injection *sauber* lösen und es ist absolut nicht notwendig, dass nur eine einzige Config existieren dürfte.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

36

04.01.2012, 11:14

Oder eine Konfigurationsklasse, die bei der ersten Verwendung initialisiert wird, und später per Singeton von überall aus verwendet werden kann, ohne jedesmal neu initialisiert werden zu müssen, und ohne alle Interfaces aufzublähen, weil Pointer weitergegeben werden müssen. Und vor allem: ohne dass irgend ein Progger (und sei ich es selbst in einem Anfall geistiger Umnachtung) eine zweite Konfigurationsklasse erzeugt, lustig Werte ändert, und sich wundert, warum sich die Änderungen nur auf einen Teil des Codes auswirkten.

Du beschreibst eigentlich einfach ein globales Objekt, und fügst hinten mal kurz eine Eigenschaft ein, die zufällig vom Singleton kommt, ohne dass sie hier Sinn macht. Mal ehrlich, wenn man schon weiß, dass es so etwas wie eine globale Config Klasse ist, wer wäre so dämlich ein eigenes, lokales Objekt zu erstellen?
Der einzige klassische Anwendungsfall ist es, globale Variablen zu verstecken und das ist dämlich. Es macht den Code nur komplizierter aber in keinster weise schöner.
Nicht kopierbare Objekte machen durchaus an einigen Stellen Sinn und können tatsächlich schwer zu findende Fehler vermeiden. Aber selbst wenn es nur eine einziges Objekt einer Klasse geben darf, müsste man imemr noch so doof sein und explizit ein neues erstellen, von daher kann man wohl sagen, dass ein Leben ganz ohne Singleton besser ist. Die Gefahr es vollkommen falsch zu benutzen ist viel zu groß und der eigentliche Nutzen sehr sehr gering.
Lieber dumm fragen, als dumm bleiben!

37

04.01.2012, 12:28

Ich hab mich entschieden einen Blick hineinzuwerfen, ohne dabei intensiv darauf einzugehen und damit zu arbeiten.
Wie immer spuckt der Compiler mir nen Fehler aus, und das bei der Kompilation des Codes von Heiko ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
    hWnd = CreateWindowEx (NULL,
                            szClassName,
                           "Das erste Fenster!",
                           WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                           100, 100,
                           300, 250,
                           NULL,
                           NULL,
                           hInst,
                           NULL);

Bei diesem Codeschnippsel streikt er. Bei den Parametern -> szClassName <- und -> "Das erste Fenster!" <- !
Es ist die Rede von Inkompabilität eines Argumentes (zwischen "LPCWSTR" und dem const "char*)
Wie lösen? Einen String erstellen?
Only God can judge me.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

38

04.01.2012, 12:30

Das Problem ist, dass "blub" ein const char* ist, dein Projekt aber im Moment mit UNICODE kompiliert wird und Windows daher einen const wchar_t* von dir will (also z.B. L"blub").
Am besten arbeitest du da mit TCHAR und packst ein TEXT() um den String.
Aber die für den Anfang vielleicht bessere Variante ist, einfach das Character Set in den Projekteigenschaften und General > Character Set auf Not Set stellen.

39

04.01.2012, 12:40

Danke es hat funktioniert. Trotzdem mach ich mir Sorgen, ich komme von selbst nie auf solche Ideen, TCHAR kannte ich z.B. bis gerade eben nicht.
Only God can judge me.

40

04.01.2012, 13:21

Ich habe noch ne Frage zu den Zeigern.
Also was ist eigentlich ein Zeiger von den beiden Sachen:

1. Eine normale Variable vor die man ein "kaufmännischen Und" setzt.

oder

2.Eine Variable, die bei der Deklaration ein Sternchen vor ihren Namen bekommt.

Ich dachte es wäre immer das 2te.
Jedoch spricht Heiko Kalista jedes mal wenn er die Adresse einer Variable an eine Funktion übergibt, von einem Zeiger.
Zitat: "Als ersten Parameter übergeben wir einen Zeiger auf eine Nachrichten Struktur vom Typ MSG, die wir in Zeilen 18 angelegt haben."
Codestelle: GetMessage(&message, NULL, 0, 0)

Hier komme ich etwas durcheinander xD
Only God can judge me.

Werbeanzeige