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

08.08.2014, 12:47

Kapitel 8 - Singletons - Vererbung des Templates

Hallo Leute,

ich "quäle" mich gerade durch die Singletons.
Ich habe die gleiche Singletonklasse wie im Buch erstellt.
Nun versuche ich von dieser mit

C-/C++-Quelltext

1
class CLogfile : public TSingleton <CLogfile>

zu vererben. Visio unterstreicht mir "<" Rot mit der Fehlermeldung: "Es wurde ein Bezeichner erwartet" an.
Jemand ne Ahnung welchen (vermutlich sehr dämlichen) Fehler ich mache?

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
// Listing 8 - Singletons

#include "stdafx.h"
#include <iostream>
using namespace std;

// Klassen
// Singleton für Logfiles
#include "TSingleton.hpp"

class CLogfile : public TSingleton <CLogfile>
{
protected:

private:

public:
    CLogfile()
    {
        cout << "In Logfile geschrieben!\n";
    }
    ~CLogfile()
    {
        cout << "Logfile geschlossen!\n";
    }
    void Status()
    {
        cout << "Status in Logfile geschrieben!\n";
    }
};


void beliebige_Funktion()
{
    // In Logfile schreiben
    CLogfile::Get()->Status();
}

int main()
{


    return 0;
}


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
// Singleton Basisklasse
#ifndef TSingleton
#define TSingleton

// Template-Klasse zum erstellen von Singleton Klassen
template <class T>
class TSingleton
{
protected:
    // Membervariablen
    static T *m_pSingleton;

private:

public:
    virtual ~TSingleton();

    // Instanz erstellen, falls noch nicht vorhanden
    inline static T* Get()
    {
        // Existiert schon eine Instanz?
        if (!m_pSingleton)
            m_pSingleton = new T; // Nein, dann neue Instanz erzeugen
        
        // Zeiger auf die Instanz zurückgeben
        return (m_pSingleton);

    }

    // Löschen der Instanz
    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
};

// Statische Variable erzeugen
template <class T>
T* TSingleton<T>::m_pSingleton = 0;

#endif

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

08.08.2014, 18:33

Puh ich bin für C++ nicht unbedingt der beste Ansprechpartner, aber sind deine Guards nicht falsch?

Quellcode

1
#ifndef TSingleton

heißt genau wie deine Klasse. Kommt es vielleicht hier irgendwo zu Problemen? Oft stellt man einen Unterstrich voran oder hängt einen hinten an. Hier ist was Wikipedia zu den Guards sagt. Ansonsten kann ich da spontan nichts zu sagen.
Als Hinweis noch, deinen Klassen ein C oder T vornan zustellen ist eigentlich nicht nötig. Ich persönlich finde dadurch wird der Name eher unleserlich. Bei Typen ist es so, wenn du einen eigenen Typ erstellst, dann handelt es sich ja im normal Fall um eine Klasse (davon ausgegangen dass du keine Structs verwendest, oder oft verwenden musst) also ist das C schon mal über. Was Templateklassen angeht, Deine IDE sagt dir ja eigentlich dass es sich um ein Template handelt, so ist das T eigentlich auch unnötig.
Und mal als Beispiel (nur fürs Prinzip). Du hast eine Klasse Node (für einen Knoten in einem Graphen). Wenn du weißt dass es sich um eine Templateklasse handelt weißt du dass du die Klasse wohl TNode genannt hast. Wenn du TNode benutzt weißt du also im Prinzip schon längst dass es sich um eine Templateklasse handelt. Ansonsten hättest du wohl eher nach einer Klasse Node gesucht. Soll heißen, es hilft dir dann auch nicht mehr weiter. Und in der reinen Benutzung ist es eigentlich egal. Ist kein "muss" aber ein Hinweis zur Leserlichkeit deines Codes.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

3

08.08.2014, 19:38

Schorsch hat schon recht, das liegt am Makro.
Der Name der Klasse wird mit nichts ersetzt und anonyme Klassen gibbets eben nicht.
Folgendes ruft die gleichen Fehlermeldungen hervor:

C-/C++-Quelltext

1
2
3
4
5
6
//Example File 0
#define A
class A{/*stuff*/};

//Example File 1
class {/*stuff*/};

Makros sind halt echt böse. ;)
Gewöhn dir am besten an, das ganze u.U. nach dem Dateinamen oder gar, je nach Umfang eines Pojekts, nach dem relativen Pfad der Datei zu benennen, relativ zum Ordner wo so der Source eben ist.
ála #ifndef A_HPP oder eben, bei wirklich größeren Projekten, wo sich Dateinamen doppeln könnten, so was wie #ifndef ASECTION_SECTION0_A_HPP
Ist eigentlich egal wie du es machst, Hauptsache es ist eindeutig und folgt konsistenten Regeln. Irgendein Mischmasch ist immer :thumbdown:

MfG
Check

4

08.08.2014, 20:28

Mit msvc > 1000 tut es sogar auch ein #pragma once ;)
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

08.08.2014, 20:31

Gibt doch auch noch pragma once. Es gab da Nachteile, ich weiß aber selbst nicht mehr genau was das war. Wird aber soweit ich das im Kopf habe auch nicht von jedem Compiler unterstützt. Visual Studio tut das aber zumindest.

edit: F5 ist dein(mein) Freund;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

6

08.08.2014, 21:46

Ich sag ja.. dämlicher Fehler.. Danke schön =)

Werbeanzeige