aboutsummaryrefslogtreecommitdiff
path: root/src/singleton.h
blob: 47adbd561c3dd2d33e4e51dcc9a76af2fa5ad833 (plain)
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
59
#ifndef SINGLETON_H
#define SINGLETON_H

#include <stdio.h>

/**
 * Provides singleton functionality in a modular sort of way.  Make this the
 * base class of any other class and you immediately gain singleton
 * functionality.  Be sure to make your constructor and various functions use
 * intellegent scoping.  Cleanup and instantiation are performed automatically
 * for you at first use and program exit.  There are two things that you must
 * do when using this template, first is to inherit from it with the name of
 * your class filling in for T and then make this class a friend of your class.
 *@code
 * // Making the Single Singleton:
 * class Single : public Singleton<Single>
 * {
 * 		friend class Singleton<Single>;
 * 	protected:
 * 		Single();
 * 		...
 * };
 @endcode
 * You can still add public functions and variables to your new Singleton child
 * class, but your constructor should be protected (hence the need for the
 * friend decleration).
 *@author Mike Buland
 */
template <class T>
class Singleton
{
protected:
	/**
	 * Private constructor.  This constructor is empty but has a body so that
	 * you can make your own override of it.  Be sure that you're override is
	 * also protected.
	 */
	Singleton() {};

private:
	/**
	 * Copy constructor, defined so that you could write your own as well.
	 */
	Singleton( const Singleton& );

public:
	/**
	 * Get a handle to the contained instance of the contained class.  It is
	 * a reference.
	 *@returns A reference to the contained object.
	 */
	static T &getInstance()
	{
		static T i;
		return i;
	}
};

#endif