C ++ Singleton - Prevent :: instance () для переменной - PullRequest
0 голосов
/ 14 июля 2020

Учитывая одноэлементный класс

class MySingleton
{
    // ...
    public:
        MySingleTon& instance() { /* ... */ }
};

, возможно ли предотвратить:

int main()
{
    // the following should cause some error
    MySingleton& singleton = MySingleton::instance();
}

, при этом разрешив:

int main()
{
    // Only directly accessing MySingleton::instance().SomeMethod should be possible
    MySingleton::instance().some_method();
}

Дополнительный пример

int main()
{
    // Following two lines should error
    MySingleton& singleton = MySingleton::instance();
    singleton.some_method();
    
    // Following line should NOT error
    // Additionally it should be the only way to access any MySingleton method besides MySingleton::instance
    MySingleton::instance().some_method();
}

1 Ответ

2 голосов
/ 14 июля 2020

Единственный известный мне способ сделать то, что вы ищете, - это сделать instance() сам private, чтобы код, не входящий в MySingleton, не мог вызвать его напрямую, а затем добавить метод static в MySingleton, то есть public и использует instance() внутри по мере необходимости, например:

class MySingleton
{
    // ...
    private:
        MySingleton() { /* ... */ }
        static MySingleton& instance() {  static MySingleton inst; return inst; }
    public:
        static void do_method() { instance().some_method(); }
};

int main()
{
    MySingleton& singleton = MySingleton::instance(); // <-- ERROR
    singleton.some_method();
    
    MySingleton::do_method(); // <-- OK
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...