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

09.03.2006, 10:09

finde Fehler nicht 2

Jetz gucke ich schon wieder seit 20min auf den code und finde da keinen fehler:) :(..

es geht um die singeltons:
hier mal mein code.(stimmt wieder fast mit dem buch überein)

singelton.hpp:

Quellcode

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
#ifndef TSINGLETON
#define TSINGLETON

template <class T>
class TSingleton
{
protected:
    static T *m_pSingleton;


public:
    virtual ~TSingleton();

    inline static T get()
    {
        if(!m_pSingleton)
            m_pSingleton = new T;
        return (m_pSingleton);
    }

    static void del()
    {
        if(m_pSingleton)
        {
            delete (m_pSingleton);
            m_pSingleton = NULL;
        }
    }
};

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

#endif


main.cpp

Quellcode

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
#include <iostream>
#include "singleton.hpp"

using namespace std;

class CLogFile : public TSingleton<CLogFile>
{
public:
    CLogFile()
    {
        cout << "Neues Logfile erstellt"<<endl;
    }
    
    ~CLogFile()
    {
        cout << "Logfile wurde geschlossen"<< endl;
    }

    void Statusmeldung()
    {
        cout << "Meldung wird ausgegeben"<< endl;
    }
};

void Funktion()
{
    CLogFile::get() -> Statusmeldung();

}


int main()
{
    int a;
    Funktion();
    CLogFile::del();

    cin >> a;
}


und dann die fehlermeldung:

Quellcode

1
2
3
4
5
6
7
8
9
Compiling...
main.cpp
m:\workspace\visual studio 2005\projects\singletons_test\singletons_test\main.cpp(27) : error C2819: type 'CLogFile' does not have an overloaded member 'operator ->'
        m:\workspace\visual studio 2005\projects\singletons_test\singletons_test\main.cpp(6) : see declaration of 'CLogFile'
        did you intend to use '.' instead?
m:\workspace\visual studio 2005\projects\singletons_test\singletons_test\main.cpp(27) : error C2232: '->CLogFile::Statusmeldung' : left operand has 'class' type, use '.'
Build log was saved at "file://m:\workspace\Visual Studio 2005\Projects\singletons_test\singletons_test\Debug\BuildLog.htm"
singletons_test - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


vielen dank

2

09.03.2006, 11:10

ahh, habe in der singelton.hpp ein * vergessen, aber nun habe ich dieses fehler:

Quellcode

1
2
3
4
5
6
7
8
9
10
------ Build started: Project: singletons_test, Configuration: Debug Win32 ------
Compiling...
main.cpp
Compiling manifest to resources...
Linking...
main.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall TSingleton<class CLogFile>::~TSingleton<class CLogFile>(void)" (??1?$TSingleton@VCLogFile@@@@UAE@XZ) referenced in function __unwindfunclet$??0CLogFile@@QAE@XZ$0
M:\workspace\Visual Studio 2005\Projects\singletons_test\Debug\singletons_test.exe : fatal error LNK1120: 1 unresolved externals
Build log was saved at "file://m:\workspace\Visual Studio 2005\Projects\singletons_test\singletons_test\Debug\BuildLog.htm"
singletons_test - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Anonymous

unregistriert

3

09.03.2006, 11:15

Hi!

Du solltest den Destruktor in deinem Template

C-/C++-Quelltext

1
 virtual ~TSingleton(); 


nicht nur deklarieren - sondern dem zumindest einen leeren Rumpf geben.
Wenn du den nur deklarierst, erwartet der Linker selbstverständlich, dass
woanders die Definition zu finden ist...

Grüße
Stefan

4

09.03.2006, 11:17

ich übersehe wohl manchmal so kleingkeiten - aber aus fehlern lernt man ja :)

D A N K E

Anonymous

unregistriert

5

09.03.2006, 12:00

Noch kurz was zu Singletons. Ich hab gerade mal etwas ausprobiert und folgendes gefällt mir recht gut:

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
#include <stdio.h>

template <class T> class Singleton
{
  public:
    static T& getInstance()
    {
      static T instance;

      return instance;
    }
};

class Test : public Singleton<Test>
{
  // Damit das Singleton den privaten Konstruktor aufrufen darf

  friend class Singleton<Test>;

  private:
    int n;

    // Konstruktor ist private damit keine "normale" Instantiierung

    // erfolgen kann

    Test()
    {
      printf("Test::Test()\n");
      n=1;
    }

    ~Test()
    {
      printf("Test::~Test()\n");
    }

  public:
    int get()
    {
      return n;
    }

    void set(int nr)
    {
      n=nr;
    }
};

int main()
{
  printf("%d\n", Test::getInstance().get() );
  Test::getInstance().set(10);
  printf("%d\n", Test::getInstance().get() );

//  Test a;  // <-- ergibt Fehler. Instantiierung nicht erlaubt


  return 0;
}


Vielleicht kanns ja jemand gebrauchen...

Grüße
Stefan

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

6

09.03.2006, 12:09

jo :)
thx

Anonymous

unregistriert

7

09.03.2006, 18:38

Finger weg von Singletons mit new und delete!

8

09.03.2006, 22:14

darf ich nochmal was fragen, was bedeutet diese fehlermeldung (bin gerade bei den log files)

Quellcode

1
2
3
m:\workspace\visual studio 2005\projects\class_logfile\class_logfile\logfile.cpp(21) : warning C4996: 'fopen' was declared deprecated
        c:\programme\microsoft visual studio 8\vc\include\stdio.h(234) : see declaration of 'fopen'
        Message: 'This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'


danke

Anonymous

unregistriert

9

09.03.2006, 22:16

Du sollst secure-Functions benutzen. also fopen_s

10

09.03.2006, 22:46

hmm, also anders als im buch!?! - dann sagt er mir, dass fopen_s nicht 2 argumente akzeptiert, wo sehe ich denn nach, was fopen_s haben möchte?

Werbeanzeige