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

koschka

Community-Fossil

  • »koschka« ist der Autor dieses Themas

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

1

11.05.2004, 09:55

static Problem ;)

Hi, ich hab mir eine statische Klasse geschrieben.

hier ein kleiner Ausschnitt (Header Datei)

Quellcode

1
2
3
4
5
6
7
8
9
    class ENGINE_API E_CEngine  {
    protected:
        static double       md_Frequency;
        static double       md_NumSecsPassed;
        static float        mf_GlobalTime;
        static bool         mb_AppActive;
        static E_CString    ms_ConfigFile;
...
    


In der CPP Datei steht folgender Code:

Quellcode

1
2
3
4
5
6
7
8
9
10
    //----------------------------------------------------------------------------
    bool        E_CEngine::mb_initialized;          // Wurde Engine gestartet
    double      E_CEngine::md_Frequency;            // Frequenz des Zeitzählers
    E_CLog      E_CEngine::m_Log;                   // Logbuch
    double      E_CEngine::md_NumSecsPassed;        // Zeit die seit dem letzten 
                                                    //  Frame vergangen ist
    bool        E_CEngine::mb_Quit;                 // Parameter für das Beenden des
                                                    // DoMessageLoops
    float       E_CEngine::mf_GlobalTime;           // Zeitzähler
    bool        E_CEngine::mb_AppActive;            // Ist Applikation aktiv


Das Problem ist meine selbst geschreibene Klasse E_CString. Wenn ich die auch mit E_CString E_CString::String definiere kommt eine Fehlermeldung vom Compiler, das diese bereits definiert sein ?!? In meiner Header Datei ist diese auch als "static" definiert. Wenn ich die Definition weglasse dann kann ich aber nicht

Quellcode

1
E_CEngine::ms_ConfigFile = "hallo";


benutzen, dort sagt mir der Compiler das angeblich der Zuweisungsoperator (=) nicht für diese Klasse definiert sei, was aber nicht stimmt ?!?. Die Klasse kommt eigentlich auch mit dem Sytntax klar und macht auch das richtige.

Kann es vielleicht daran liegen, das ich Die String Klasse vor der Engine Klasse definiert habe: so in etwa:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Vordefinitionen
//-----------------------------
class ENGINE_API E_CLog;  
class ENGINE_API E_CString;

// Engine Klasse im Namensraum Engine
//--------------------------------------------------
namespace Engine  {
    class ENGINE_API E_CEngine  {
    protected:
        static double       md_Frequency;
        static double       md_NumSecsPassed;
        static float        mf_GlobalTime;
        static bool         mb_AppActive;
        static E_CString    ms_ConfigFile;
....
};
}

// Bestandteile der Engine hinzufügen
//--------------------------------------------------
#include "e_log.h"                                      // Logbuch
#include "e_string.h"                                   // String Klasse


Das komische ist ja das das mit der Logbuch Klasse einwandfrei funktioniert, nicht aber mit der String Klasse :). Danke für eure Hilfe, wenn ich noch die String Klasse posten soll müsst ihrs sagen :)

2

11.05.2004, 13:56

benutzt doch lieber singleton, das mit static is nich so gut ^^

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

3

11.05.2004, 14:18

Schäm Dich, use singleton pattern ;)

http://bens.c-plusplus.info/ --> FAQ --> Singleton

4

11.05.2004, 14:41

Zitat

E_CString E_CString::String
Was soll das denn für eine Definition sein? Du hast als Rückgabetyp E_CString, Klasse E_CString, aber was ist String? Eindatentyp oder eine Methode?

Ich kann keine Fehler in deiner E_CEngine Klasse finden. Funktioniert den E_CString in anderen Situationen?
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

koschka

Community-Fossil

  • »koschka« ist der Autor dieses Themas

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

5

11.05.2004, 21:21

Danke erstmal für die Antworten:

@ Drogonmaster: E_CString E_CString::String sehe ich nirgendwo definiert :) und ist auch in meiner Engine nicht so vorgesehen (siehe unten)

@ andere:
Singleton (hoffentlich habe ich das richtige geschrieben) - noch nie davon etwas gehört, danke für den Link ;) werde mich damit beschäftigen, aber zuerst will ich das static Problem an sich lösen. So hier nochmal der Ausschnitt. Man beachte die E_CLog Klasse funktioniert mit static einwandfrei, ich frage mich nur warum diese doofe String Klasse nicht funktioniert.

Die String Klasse fubnktioniert sonst einwandfrei. Also so was wie E_CString TestStr; TestStr = "hallo Cpp Community" bekommt die allemehl hin.

Anmerkung: alles leigt im Namensraum "Engine"

HeaderFile

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
    class ENGINE_API E_CEngine  {
    protected:
        static double       md_Frequency;
        static double       md_NumSecsPassed;
        static float        mf_GlobalTime;
        static bool         mb_AppActive;
        static E_CString    ms_ConfigFile;
    private:
        static bool         mb_Quit;
        static bool         mb_initialized;
    public:
        static E_CLog       m_Log;


CPP- File

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    //----------------------------------------------------------------------------
    bool        E_CEngine::mb_initialized;          // Wurde Engine gestartet
    double      E_CEngine::md_Frequency;            // Frequenz des Zeitzählers
    E_CLog      E_CEngine::m_Log;                   // Logbuch
    double      E_CEngine::md_NumSecsPassed;        // Zeit die seit dem letzten 
                                                    //  Frame vergangen ist
    bool        E_CEngine::mb_Quit;                 // Parameter für das Beenden des
                                                    // DoMessageLoops
    float       E_CEngine::mf_GlobalTime;           // Zeitzähler
    bool        E_CEngine::mb_AppActive;            // Ist Applikation aktiv
    E_CString   E_CEngine::ms_ConfigFile;       // will der Compiler nicht  
    //----------------------------------------------------------------------------

    // Standard Konstructor der Engine Klasse
    //----------------------------------------------------------------------------
    E_CEngine::E_CEngine()  
    {
        // Speicher leeren
        ZeroMemory(this, sizeof(E_CEngine));
// geht nicht, operator nicht gefunden, obwohl definiert
        //E_CEngine::ms_ConfigFile = "hallo";
    }

koschka

Community-Fossil

  • »koschka« ist der Autor dieses Themas

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

6

16.05.2004, 13:42

Ich hab die Lösung gefunden, E_CSTZring war nicht im Namensraum Engine definiert. Dieser Namensraum ist jetzt "Core"

Quellcode

1
2
3
4
5
// Vordefinitionen "Core" Bereich
//--------------------------------------------------------------------------------------------------
namespace Core  {
    class ENGINE_API E_CString;
}


Quellcode

1
2
3
4
5
6
7
8
9
namespace Core  {
    class ENGINE_API E_CEngine  {
    protected:
        static double       md_Frequency;
        static double       md_NumSecsPassed;
        static float        mf_GlobalTime;
        static bool         mb_AppActive;
        static E_CString    ms_ConfigFile;
    .... }; }

Werbeanzeige