Является ли следующая реализация C ++ синглтоном? - PullRequest
1 голос
/ 15 ноября 2010

В интернете я видел шаблон для реализации синглтон-класса следующим образом:

class singleton {
public:
    int a;
    void print()
    {
        std::cout << a << std::endl;
    }
} singleton;

int main()
{
    // singleton b; COMPILATION ERROR
    singleton.a = 3;
    singleton.print();

    return 0;
}

Он компилируется в GCC, но у меня сложилось впечатление, что именование экземпляра в качестве имени класса на самом деле не являетсяправильный способ кодирования.

  • Существуют ли какие-либо специальные правила, запрещающие такое соглашение (имя экземпляра совпадает с именем класса)
  • Компилируется ли исходный код в другом компиляторе?

Ответы [ 4 ]

7 голосов
/ 15 ноября 2010
class singleton ss;

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

5 голосов
/ 15 ноября 2010

Относительно двух вопросов, которые вы буквально задаете,

  • да, C ++ имеет понятие имен разных видов, сосуществующих в той же области, что и в C, и

  • да, когда включен соответствующий заголовок, код прекрасно компилируется с MinGW g ++ 4.4.1, Visual C ++ 10.0 и Comeau Online 4.3.10.1.

Если вы сомневаетесь в том, что какой-то фрагмент кода соответствует стандарту, на практике просто отправьте его в Comeau Online .

То, что код технически в порядке, не означает, что все в порядке ...: -)

Singleton используется для описания чего-то отличного от глобальной переменной . То, что у вас есть, является глобальной переменной. Ergo, это не синглтон.

Два основных свойства синглтона

  • существует глобально уникальный экземпляр, а

  • этот экземпляр создается лениво, по требованию.

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

  • только один экземпляр.

Последнее является настолько распространенной причиной использования синглетонов, что, например, Статья Википедии о синглетонах описывает синглтон как "ограничение создания класса одним объектом". Но это упрощенный взгляд. Иногда нужно определенное количество экземпляров, как синглетоны. И, например, для Python нередко описывать значения False и True в Python как синглтоны типа bool. А иногда требуется синглтон (или синглтоны), но при этом допускается произвольная реализация.

В C ++ один особенно простой способ реализации синглтона известен как Meyers 'Singleton . По сути, экземпляр singleton является статической переменной в функции, которая обеспечивает к нему доступ. Обычно это сочетается с запретом общего создания класса, например, с помощью конструктора или всех конструкторов private, а одноэлементная функция доступа static функция-член.

Приветствия и hth.,

3 голосов
/ 15 ноября 2010

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

3 голосов
/ 15 ноября 2010

Если вам приходится прибегать к глобальному состоянию, основным преимуществом синглтона над обычной глобальной переменной является ленивая загрузка ... то есть, объект синглтона не будет создан, пока не будет вызван метод GetInstance () для первый раз.

Мне не нравится эта реализация, так как она не поддерживает отложенную загрузку, и это, наряду с отсутствием ограничения на один экземпляр (как указал Джон), отрицательно сказывается на ее цели.

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