Stati c указатель + publi c конструктор - PullRequest
0 голосов
/ 25 марта 2020

[с использованием C ++] Я знаю паттерн Singleton, где конструктор private и есть указатель stati c на class, возвращенный из какой-то функции static GetInstance(). Но когда нужен класс с конструктором publi c, например:

//hpp file
class MyClass{
    static MyClass * myptr;
public:
    static const MyClass * GetInstance() { return myptr; }

    MyClass() { myptr = this };
    ~MyClass() {}
    ...
}

//cpp file
MyClass * MyClass::myptr = nullptr;

Что происходит каждый раз, когда мы создаем новый объект с помощью конструктора? myptr перезаписано? Каковы возможные варианты использования этого шаблона?

Ответы [ 3 ]

4 голосов
/ 25 марта 2020

Ужасные вещи могут go не так с этим. Например:

void func()
{
    MyClass obj; // Memory allocated on stack here and put into static pointer
} // Stack memory deallocated here

int main()
{
    func();

    const MyClass* ptr = MyClass::GetInstance(); // Dangling pointer
}

Только не делайте этого.

2 голосов
/ 25 марта 2020

Что происходит каждый раз, когда мы создаем новый объект с помощью конструктора? myptr перезаписано?

Да.

Каковы возможные варианты использования этого шаблона?

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

1 голос
/ 25 марта 2020

Я думаю, это интересно. Это не обычный синглтон, но похожий в некоторых отношениях.

Подумайте об этой сцене:

  1. Несколько потоков поддерживают MyClass::myptr, и каждый поток может перезаписать его.

  2. Несколько потоков используют MyClass::myptr как обычный синглтон (на самом деле это не так).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...