Самый эффективный способ использования классов Singleton - PullRequest
1 голос
/ 28 января 2012

В C ++ я использую одноэлементный класс и ссылаюсь на единственный экземпляр в другом классе.Мне интересно, каков наиболее эффективный способ доступа к этому экземпляру, поскольку это большая структура данных.Я учел эти вещи.

  1. Получение ссылки из одноэлементного класса, кроме передачи структуры данных по значению
  2. Использование глобального экземпляра во втором классе, в котором используется одноэлементный класс:

    Singleton* singleInstance;
    
    SingletonUser::SingletonUser ()
    {
        singleInstance = Singleton::getInstance(); //passes the single instance by   reference, then it will be used in the class wherever needed
    }
    
  3. То же самое происходит внутри функции второго класса, так что я получаю ссылку на экземпляр синглтон-класса, когда мне это нужно (необходимо получить к нему доступ несколько раз в нескольких функциях).

Я не уверен, какая практика является лучшей.Может кто-нибудь объяснить, и если есть более эффективный способ, объяснить это тоже?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 28 января 2012

Если вы передаете свой экземпляр синглтона по значению, значит, это не одноэлементный файл, не так ли?

Просто возвращайте ссылку (или указатель) на экземпляр всякий раз, когда вам нужно получить к нему доступ (#1).Кэширование ссылки один раз для каждого клиента только увеличит сложность и почти наверняка не будет быстрее.

Я не уверен, в чем разница между # 1 и # 3, помимо дополнительной сложности.Оба используют функцию для доступа к экземпляру синглтона через ссылку / указатель.

2 голосов
/ 28 января 2012

Во-первых, в C ++ избегайте указателей, когда это возможно, вместо этого передайте по ссылке:

Singleton& Singleton::getInstance() {
    return *singleton;
}

Затем в коде:

Singleton& st = Singleton::getInstance();
st.someFunction();
1 голос
/ 28 января 2012

Ваш вариант № 3 является наиболее предпочтительным.Постарайтесь не кешировать ссылки без необходимости - со временем эти кэшированные ссылки, как правило, становятся бременем для обслуживания.

И вообще, старайтесь избегать шаблона синглтона.В C ++ глобальная функция (не являющаяся членом) так же хороша и позволяет развиваться дизайну.

...