Вы сказали, что «создание одного раза повредит все приложение». Мой ответ: так что не делайте больше одного. В C ++ система типов слишком слаба, чтобы легко обеспечить это во время компиляции. Тем не менее, мы все еще можем написать утилиту, чтобы приблизить ее во время выполнения.
Обратите внимание, что это никоим образом не означает, что вы должны использовать синглтон. (У вас нет нужды в глобальном. К сожалению, дроны связывают один экземпляр с глобальным). То, что вы хотите, это:
#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
}