---
title: "Singleton"
type: "forum-thread"
url: "https://www.webforum.nu/amne/c-cpp/88624-singleton"
topic: "C/C++"
topic_url: "https://www.webforum.nu/amne/c-cpp"
author: "Alpha II"
published: "2003-10-16T13:00:50.000Z"
updated: "2003-10-17T18:08:44.000Z"
replies: 8
views: 545
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/c-cpp/88624-singleton"
---

# Singleton

## #1 — Alpha II, 2003-10-16T13:00Z

Jag behöver göra en class som hanterar texturer och kan användas överallt i programmet. Jag tror att lösningen på mitt problem är att använda en singleton. Jag har förstått att singleton classen har en statisk pekare till den faktiska klassen. Men hur ska resten av koden se ut? Hur kommer jag åt en medlemsvariabel, anropar medlemsfunktioner osv.

Permalänk: https://www.webforum.nu/p/88624

## #2 — SPiN, 2003-10-16T13:12Z

Du skapar en helt vanlig klass, med ett fält med en instans av sig själv. Klassen bör ha en privat konstruktor för att förhindra att instanser skapas. Du har sedan en statisk metod som returnerar samma objekt vid varje användning, och om instansen inte finns - skapas en ny.

Psuedo-kod:

```
klass Singleton [
     privat Singleton av typen singl;

     privat konstruktor [];

     statisk publik Singleton getSingl() [
          om singl är NULL skapa ny( Singleton->singl );
          
          returnera singl;
     ];
];
```

Hajjar? :)

Permalänk: https://www.webforum.nu/p/1188117

## #3 — Alpha II, 2003-10-16T14:50Z

mhm. men hur skapar jag en singleton om konstruktorn är privat?

Permalänk: https://www.webforum.nu/p/1188205

## #4 — SPiN, 2003-10-16T14:53Z

Genom att anropa den statiska metoden som returnerar en Singleton:

```
Singleton MySingleton = Singleton.getSingl();
MySingleton.foo();
MySingleton.bar( foobar );
```

Permalänk: https://www.webforum.nu/p/1188210

## #5 — Alpha II, 2003-10-16T15:36Z

Jag förstår ändå inte. :(

Jag vill använda min singleton i en funktion och srkiver så här:
CTimer timer = CTimer.Instance();

...men jag får ett felmeddelande om "illegal use of an expression" :(

Permalänk: https://www.webforum.nu/p/1188255

## #6 — Phorpher, 2003-10-16T16:29Z

Har du lust att posta lite kod? :)

Permalänk: https://www.webforum.nu/p/1188287

## #7 — SPiN, 2003-10-16T16:37Z

Hmm, hur ser din klass ut?

Så här hade jag gjort:

```
class CTimer {
     private:
          CTimer ctimer;
          CTimer();
          bool loaded;
     public:
          static CTimer getInstance();
          bool getLoaded();
          void setLoaded( bool );
};

CTimer CTimer::getInstance() {
     if( !ctimer.getLoaded() )
          ctimer.setLoaded( true );

     return ctimer;
}

bool CTimer::getLoaded() {
     return loaded;
}

void CTimer::setLoaded( bool bl ) {
     loaded = bl;
}
```

Anropas:

```
CTimer ctimer = CTimer.getInstance();
```

Så gör jag i Java åtminstone, eftersom att mina C++-kunskaper är väldigt begränsade så vet jag inte om det är riktigt. :)

Permalänk: https://www.webforum.nu/p/1188292

## #8 — Alpha II, 2003-10-16T17:36Z

timer.h

```
#ifndef _TIMER_H_
#define _TIMER_H_

class CFPSTimer;

class CTimer
{

public:

	// Returns the real instance. If NULL create one.
	static CTimer const * Instance();

	// Returns the current time
	__int64 GetTime() const;

	// Returns the time elapsed since the given time (can be < 0)
	__int64 ElapsedSince( __int64 start ) const;

	// Returns true if the current time is later than the specified time
	bool IsPast( __int64 end ) const;

	// Converts ticks to seconds
	static double ToSeconds( __int64 ticks );

	// Returns the clock tick frequency (ticks per second)
	__int64 GetFrequency() const			{ return m_Frequency; }

protected:

	// Constructor
	CTimer();

	// Destructor
	~CTimer();

private:

	static __int64 m_Frequency;

	static CTimer * m_pInstance;

};

//----------------------------------------------------------------------------------

inline __int64 CTimer::ElapsedSince( __int64 start ) const
{
	return ( GetTime() - start );
}

inline bool CTimer::IsPast( __int64 end ) const
{
	return ( ElapsedSince( end ) > 0 );
}

inline double CTimer::ToSeconds( __int64 ticks )
{
	return double( ticks ) / double( m_Frequency );
}

#endif
```

timer.cpp

```
#define STRICT
#define WIN32_LEAN_AND_MEAN
#define NOMINMAX

#include "timer.h"

#include <windows.h>

CTimer *	CTimer::m_pInstance	= 0;
__int64		CTimer::m_Frequency	= 1;

//----------------------------------------------------------------------------------

CTimer::CTimer()
{
	LARGE_INTEGER	frequency;
	BOOL			ok;

	ok = QueryPerformanceFrequency( &frequency );
	if ( ok == 0 )
	{
		// Error
	}

	m_Frequency = frequency.QuadPart;
}

//----------------------------------------------------------------------------------

CTimer::~CTimer()
{
}

//----------------------------------------------------------------------------------

CTimer const * CTimer::Instance()
{
	if (m_pInstance == NULL)
		m_pInstance = new CTimer;
	return m_pInstance ;
};

//----------------------------------------------------------------------------------

__int64 CTimer::GetTime() const
{
	LARGE_INTEGER	time;

	QueryPerformanceCounter( &time );

	return time.QuadPart;
}
```

Permalänk: https://www.webforum.nu/p/1188334

## #9 — Alpha II, 2003-10-17T18:08Z

Det var ett \* tecken som saknades  :r 

```
CTimer [b]*[/b] timer = CTimer::Instance();
```

Permalänk: https://www.webforum.nu/p/1188971

---

Tråden på webben: https://www.webforum.nu/amne/c-cpp/88624-singleton
