blob: 0bcc3f723a646ebc3602bb987cd9be4446ae043c (
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
60
61
62
63
64
65
66
67
68
|
/*
* Copyright (C) 2007-2008 Xagasoft, All rights reserved.
*
* This file is part of the libbu++ library and is released under the
* terms of the license contained in the file LICENSE.
*/
#ifndef BU_SINGLETON_H
#define BU_SINGLETON_H
#include <stdio.h>
namespace Bu
{
/**
* 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).
*/
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
|