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

1

07.01.2005, 17:08

Fragen zum Kapitel 8

Hi all!

Ich bin zur Zeit am Ende des Kapitels 8 (Fortgeschrittene Themen). Ich finde aber, dass die Listings in diesem Kapitel manchmal etwas zu wenig beschrieben sind. Ich will es genauer wissen :) ! Deshalb habe ich diverse Fragen zu zwei Listings (Listing 8.6 und Listing 8.11) und zum Logfile.

1. | Listing 8.6 Singletons
1.1 Zeilen 1 und 2: Was sollen diese beiden Zeilen? "um möglichen Mehrfachdeklarationen vorzubeugen" Was soll das genau bedeuten?
1.2 Zeile 40: Weshalb ist die Funktion Del nicht auch inline wie die Funktion Get?
1.3 Zeilen 34 und 45: Ist die Variable m_pSingleton in Klammern, weil es ein Zeiger ist?

2. | Listing 8.11 Logfile.hpp
2.1 Zeilen 1 und 2: Hier sind wieder diese Präprozessordirektiven wie in Frage 1.1., aber was bedeutet jetzt __ (zwei Unterstriche)?
2.2 Zeilen 12 und 13: Diese Defines brauchen ja keinen Speicher, aber weshalb sind sie nötig? Man kann ja einen Vergleich einfach mit true oder false schreiben.

3. | Schriftart "courier new" im Logfile
3.1 Ist "courier new" eingentlich so die Standard-Schriftart für Quellcodes und Statusmeldungen eines Programmes (wie im Logfile)?
3.2 Ist "courier new" auf den meisten Betriebssystemen vorhanden? Muss ich keine Sorgen haben, dass ein Betriebssystem diese Schriftart nicht anzeigen kann?


Es sind jetzt schon ziemlich viele Fragen... Ich bin aber jedem dankbar, der mir eine dieser Fragen beatnworten kann. Sonst ist das Buch wirklich spitze! Die Beispiele sind echt schön und lehrreich.
Weiter so! :prost:
Ich werde mir mit der Zeit eine eigene Logfile-Klasse programmieren.

Schönes Weekend!
Benjamin Fischer

Heiko Kalista

Treue Seele

Beiträge: 99

Wohnort: Hessen

  • Private Nachricht senden

2

09.01.2005, 18:28

Hi!

1.1:
Wenn man diese Header-Datei auch in anderen Dateien per include einbindet, kann es zu Mehrfachdeklarationen kommen. Die einzelnen Dateien werden ja sozusagen zu einer großen Datei zusammengesetzt. Erstelle dir einfach mal noch eine .cpp Datei, in der Du den Header der Logfile-Klasse ebenfalls einbindest und lasse die beiden Zeilen weg, dann siehst du, was ich meine.

1.3:
Diese Klammern müssen nicht sein, es ist lediglich eine andere Schreibweise. Man kann sie genauso gut einfach weglassen. Scheinbar bin ich im Buch mit den beiden Schreibweisen etwas durcheinander gekommen, da man normalerweise immer einheitlich vorgehen sollte. Ich selbst verwende bei "return" eigentlich immer Klammern, da ich es so übersichtlicher finde.

2.1:
Das ist einfach eine andere Art der Namensgebung und hat keine wirkliche Bedeutung. Im Grunde verwendet man diese beiden Unterstriche einfach dazu, dass es keine Überschneidungen mit anderen Defines gibt. Die sogenannten "include-guards" (also die ifndef, define, endif Geschichte) sollten in der Regel immer mit zwei Unterstrichen beginnen, um einfach etwas mehr Klarheit und Sicherheit zu schaffen.

2.2:
Nötig sind sie nicht, aber es sorgt für etwas mehr Übersichtlichkeit. Oft sagen klare "Worte" mehr aus, als einfach nur true oder false.

3.1:
Die Courier-Schriftart hat den Vorteil, dass die Buchstaben immer die gleiche Breite haben, weshalb man gerade Quellcode besser formatieren kann. Geh einfach mal her und ändere in Deiner Entwicklungsumgebung die Schriftart für den Quellcode beispielsweise auf "Times new Roman", dann wirst Du sofort den Unterschied sehen.

3.2:
Mir wäre jetzt nicht bekannt, dass es hier zu Problemen kommen könnte. Aber da bin ich auch ein wenig überfragt, vielleicht weiss hier jemand was genaueres.

mfg,
Heiko

Anonymous

unregistriert

3

09.01.2005, 18:49

3.2

Linux Distributionen kennen "Courier New" nicht auf Anhieb, mann kann diese aber natürlich nachreichen. Dieses ist allerdings unnötig da es auch unter Linux (zb Suse/Debian) "Courier" Schriften gibt die standardmässig installiert werden. Der Text wird dann von Linux in der Schrift dargestellt die in der grafischen Oberfläche als Standard definiert wurde.

Beim MAC ist es genauso, auch dieser verfügt von Hause aus über "Courier" Schriften die mann definieren kann.

cu Linux

4

10.01.2005, 14:08

Danke!

Hi ihr zwei!

Vielen, vielen Dank, dass ihr euch die Zeit genommen und mir die Fragen beantwortet habt!
:prost:

Ich bin jetzt mit dem Buch fertig und werde einmal mit dem Buch von David Scherfgen beginnen.

Benjamin

FLO2

Treue Seele

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

5

12.07.2009, 11:00

Hi

Nennt mich Totengräber oder Leichenschänder aber besser als einen neuen Thread zu öffnen.( :D )

1.3.2
Ist das nur bei diesen Singletons so oder hab ich was verpasst :? , es wird ein Zeiger per return zurückgegeben. Ein Vorteil von Zeigern ist es doch das man ihn NICHT per return zurückgeben muss. :?

Danke im Voraus! :D
Pi mal Daumen = 18.84955592

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

12.07.2009, 12:02

Bedenke, dass nicht jeder das Buch (gerade zur Verfügung) hat und somit musst vlt. etwas präziser werden, was du meinst.

Die Rückgabe hat nichts mit Zeiger/nicht-Zeiger zu tun. Das funktioniert immer gleich..

Du meinst vielleicht, dass man einen Zeiger an eine Funktion übergeben kann und dann die Funktion dasjenige Objekt verändern kann und sich das auf das ursprüngliche auswirkt. Ja. Das wäre dann ein Einsatzgebiet von Zeigern.

FLO2

Treue Seele

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

7

12.07.2009, 13:40

Danke für die Antwort :D

Zitat von »"drakon"«

Bedenke, dass nicht jeder das Buch (gerade zur Verfügung) hat und somit musst vlt. etwas präziser werden, was du meinst.

Sorry, daran hab ich nicht gedacht :?

Zitat von »"drakon"«

Du meinst vielleicht, dass man einen Zeiger an eine Funktion übergeben kann und dann die Funktion dasjenige Objekt verändern kann und sich das auf das ursprüngliche auswirkt. Ja. Das wäre dann ein Einsatzgebiet von Zeigern.

Genau! Doch hier(eine Singleton-Klasse) wird in der Funktion Get() am Ende ein Zeiger per return zurückgegeben. :?:
(Hab den ganzen Code gepostet da es sonst keinen Sinn ergibt)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#ifndef TSINGLETON
#define TSINGLETON

template <class T>
class TSingleton
{
    protected:

        // Membervariablen

        static T *m_pSingleton; // Statisches Objekt


    public:

        // Memberfunktionen


        // Destruktor

        //

        virtual ~TSingleton ()
        {
        }

        // Get

        //

        // Aufgabe: Wenn nötig, statische Objekt erzeugen und

        //          Zeiger darauf zurückgeben

        //

        inline static T* Get ()
        {
            // Exestiert schon eine Instanz?

            if (!m_pSingleton)
                m_pSingleton = new T;   // Nein, dann neue Instanz erzeugen


            // Zeiger auf die Instanz zurückgeben

            return (m_pSingleton);

        }   // Get


        // Statisches Objekt freigeben

        //

        static void Del ()
        {
            // Gab es eine Instanz

            if (m_pSingleton)
            {
                delete (m_pSingleton);  // Ja dann freigeben

                m_pSingleton = NULL;    // und Zeiger auf NULL setzen

            }

        }   // Del


};

// Die statische Variable erzeugen

//

template <class T>
T* TSingleton<T>::m_pSingleton = 0;

#endif


Danke im Voraus :D
Pi mal Daumen = 18.84955592

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

12.07.2009, 13:47

Ich verstehe deine Frage immer noch nicht richtig. Was willst du konkret wissen?! - Das mit den Klammern sollte ja klar sein, oder?

btw:
Ich finde dieses Singleton nicht gerade gut. Ich würde eher das Meyers Singleton Pattern verwenden.

FLO2

Treue Seele

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

9

12.07.2009, 13:59

Ja das mit den Klammern ist klar :)
Ich frage mich wieso muss ich m_pSingleton per return zurückgeben.
Wie du schon erwähnt hast ändert die Funktion Get das Objekt über den Zeiger. Dann ist das returnen doch unnötig?

Zitat von »"drakon"«

btw:
Ich finde dieses Singleton nicht gerade gut. Ich würde eher das Meyers Singleton Pattern verwenden.

Das war das Beispiel aus dem Buch deswegen habe ich es gepostet.
Verwenden werde ich dann das andere :D

Danke im Voraus :D
Pi mal Daumen = 18.84955592

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

10

12.07.2009, 14:11

Die Get Funktion ändert rein gar nichts an dem Objekt. Es erzeugt lediglich eine Instanz, wenn das vorhin nicht schon getan wurde und gibt einen Zeiger darauf zurück.

Es wird ja kein Zeiger auf einen Zeiger übergeben..

Man könnte natürlich das hier machen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
        inline static void Get ( T** pT)
        {
            // Exestiert schon eine Instanz?

            if (!m_pSingleton)
                m_pSingleton = new T;    // Nein, dann neue Instanz erzeugen


            // Zeiger auf die Instanz zurückgeben

            *pT = m_pSingleton;

        }    // Get


Was aber bei einem Singleton ziemlich unhantlich ist, weil man den schönen Aufruf über den -> - Operator nicht mehr hat.

Werbeanzeige