Я протестировал шаблон для объявления одноэлементного класса в C ++, который делает по умолчанию деструктор ‘private’, но шаблон не использует этот деструктор при вызове любого члена.
Я тестировал этот код на Ubuntu QQ с помощью компилятора gnu g ++ — деструктор вызывался при завершении программы, хотя и обозначался как «приватный».
Кто / Что / Как называется этот деструктор, так как он обозначен как частный?
Примечание. Я пришел из мира Delphi / Object Pascal, и ObjectPascal не поддерживает объявление статического класса, хотя существует несколько способов создания синглтона. По моему опыту, «частный» («строго частный» …) ЧАСТНЫЙ. Я вижу, что в C ++ это не совсем так.
Объяснение?
(Отредактировано после редактирования OP)
Закрытие деструктора предотвращает его явный вызов.
Если бы деструктор был публичным, это было бы законно:
MyClass.getInstance().~MyClass();
Деструкторы статических объектов хранения вызываются в результате возврата из main () или вызова exit ().
Объект обычно создается static
функция-член называется что-то вроде getInstance
, который затем дает вам ссылку на объект. Поскольку это функция-член, она имеет доступ к конструктору.
Классический пример:
class S
{
public:
// This is a member function so can access the constructor of S
static S& getInstance()
{
static S instance;
return instance;
}
private:
S() {};
S(S const&);
void operator=(S const&);
};
Типичные одноэлементные классы имеют статическую функцию-член, которая возвращает указатель на одноэлементный объект. Например:
Singleton *Singleton::instance();
где instance()
статическая функция-член Статическая функция-член может вызывать закрытые конструкторы.
Они являются частными, потому что вы не хотите разрешать создание или уничтожение этого объекта каким-либо внешним кодом. Синглтоны обычно имеют статический экземпляр, который инициализируется и удаляется с помощью заводских методов.
tempalte <class T>
class Singleton
{
public:
static T* GetInstance()
{
if(!m_sInstance)
{
m_sInstance = new T();
}
return m_sInstance;
}
static void DestroyInstance()
{
delete m_sInstance;
m_sInstance = 0;
}
private:
static T* m_sInstance;
};
class Foo : public Singleton<Foo>
{
friend class Singleton<Foo>;
private:
Foo();
~Foo();
};
Так что вы можете позвонить Foo::GetInstance()
а также Foo::DestroyInstance()
для доступа и удаления одноэлементного объекта.