Почему / Как механизм, который очищает статику, получает права доступа, которые позволяют ему вызывать частных пользователей?

Я протестировал шаблон для объявления одноэлементного класса в C ++, который делает по умолчанию деструктор ‘private’, но шаблон не использует этот деструктор при вызове любого члена.

Я тестировал этот код на Ubuntu QQ с помощью компилятора gnu g ++ — деструктор вызывался при завершении программы, хотя и обозначался как «приватный».

Кто / Что / Как называется этот деструктор, так как он обозначен как частный?

Примечание. Я пришел из мира Delphi / Object Pascal, и ObjectPascal не поддерживает объявление статического класса, хотя существует несколько способов создания синглтона. По моему опыту, «частный» («строго частный» …) ЧАСТНЫЙ. Я вижу, что в C ++ это не совсем так.

Объяснение?

3

Решение

(Отредактировано после редактирования OP)

Закрытие деструктора предотвращает его явный вызов.

Если бы деструктор был публичным, это было бы законно:

 MyClass.getInstance().~MyClass();

Деструкторы статических объектов хранения вызываются в результате возврата из main () или вызова exit ().

1

Другие решения

Объект обычно создается 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&);
};
4

Типичные одноэлементные классы имеют статическую функцию-член, которая возвращает указатель на одноэлементный объект. Например:

Singleton *Singleton::instance();

где instance() статическая функция-член Статическая функция-член может вызывать закрытые конструкторы.

1

Они являются частными, потому что вы не хотите разрешать создание или уничтожение этого объекта каким-либо внешним кодом. Синглтоны обычно имеют статический экземпляр, который инициализируется и удаляется с помощью заводских методов.

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() для доступа и удаления одноэлементного объекта.

1
По вопросам рекламы [email protected]