локального класса Я думаю, что вы что-то вроде этого (примечание: скопировано с an answer I already wrote and forgot about):
#include <stdexcept>
// inherit from this class (privately) to ensure only
// a single instance of the derived class is created
template <typename D> // CRTP (to give each instantiation its own flag)
class single_instance
{
protected: // protected constructors to ensure this is used as a mixin
single_instance()
{
if (mConstructed)
throw std::runtime_error("already created");
mConstructed = true;
}
~single_instance()
{
mConstructed = false;
}
private:
// private and not defined in order to
// force the derived class be noncopyable
single_instance(const single_instance&);
single_instance& operator=(const single_instance&);
static bool mConstructed;
};
template <typename T>
bool single_instance<T>::mConstructed = false;
Теперь вы получите исключение, если класс строится больше, чем когда-то:
class my_class : private single_instance<my_class>
{
public:
// usual interface (nonycopyable)
};
int main()
{
my_class a; // okay
my_class b; // exception
}
Там нет никакого способа, чтобы реализовать политику одного экземпляра во время компиляции в C++, хотя.
(Также хорошо на вас для заметив, что одноэлементные тупые. Глобально доступны и однократно creatable два разных понятия, и должны быть объединены только по совпадению, а не дизайн.)
Типичный синглтон шаблон инкапсулирует объект singleton как частный статический член одноэлементного класса и предоставляет метод 'Instance()' для доступа. Этого недостаточно? –
Это то, что вы хотите, чтобы только некоторые классы могли получать объект singleton? – davogotland
Нет, мне не разрешено использовать Singleton, потому что с этим шаблоном экземпляр объекта является глобальным, а затем доступен везде в программе, которая небезопасна. – koleror