Кто-либо может предоставить мне образец Singleton в C++?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

38
задан FruitBreak 31 October 2012 в 11:06
поделиться

9 ответов

Можно постараться не должными быть удалить его при помощи статического объекта как это:

if(m_pA == 0) {
    static A static_instance;
    m_pA = &static_instance;
}
12
ответ дан Evan Teran 27 November 2019 в 02:55
поделиться

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

Вы никогда не должны быть в состоянии освободить одиночный элемент вручную. Как Вы знаете, кто сохраняет ссылку на одиночный элемент? Если Вы не знаете (или не может гарантировать), ни у кого нет ссылки (в Вашем случае через указатель) тогда, у Вас нет бизнеса, освобождая объект.

Использование помехи в функциональном методе.
Это гарантирует, что создается и уничтожается только однажды. Это также дает Вам ленивую инициализацию бесплатно.

class S
{
    public:
        static S& getInstance()
        {
            static S    instance;
            return instance;
        }
    private:
        S() {}
        S(S const&);              // Don't Implement.
        void operator=(S const&); // Don't implement
 };

Примечание также необходимо сделать конструктора частным. Также удостоверьтесь, что Вы переопределяете конструктора копии по умолчанию и оператор присваивания так, чтобы Вы не могли сделать копию одиночного элемента (иначе, это не был бы одиночный элемент).

Также чтение:

Singleton C++, Чтобы удостовериться, что Вы используете одиночный элемент по корректным причинам.

, Хотя технически не ориентированный на многопотоковое исполнение в общем случае см.:
, Каково время жизни статической переменной в функции C++?

GCC имеет явный патч для компенсации этого:
http://gcc.gnu.org/ml/gcc-patches/2004-09/msg00265.html

197
ответ дан Community 27 November 2019 в 02:55
поделиться

Одиночный элемент в C++ может быть записан таким образом:

static A* A::GetInstance() {
    static A sin;
    return &sin;
}
4
ответ дан sep 27 November 2019 в 02:55
поделиться

Просто не забывайте делать конструктора копии и операторы присваивания частными.

2
ответ дан Jasper Bekkers 27 November 2019 в 02:55
поделиться

Я не думаю, что существует любая причина записать ту строку нет. Ваш метод деструктора не статичен, и Ваш одноэлементный экземпляр не будет разрушен тем способом. Я не думаю, что деструктор необходим, если Вам нужно к очистке, объект использует статический метод, у Вас есть созданный alread, FreeInstance ().

Кроме этого, Вы создаете свои одиночные элементы примерно тем же способом, которым я создаю мои.

1
ответ дан Odd 27 November 2019 в 02:55
поделиться

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

я склонен находить, что Вы заканчиваете тем, что сослались на метод 'Экземпляра' сознательно рано в инициализации приложения, удостоверились, что они создаются, когда Вы хотите, и затем играющий все виды игр с разрушением из-за непредсказуемого (или по крайней мере очень сложный и несколько скрытый) порядок, в котором уничтожаются вещи.

YMMV, конечно, и это зависит немного от природы самого одиночного элемента, но много вафли об умных одиночных элементах (и проблемы поточной обработки/блокировки, которые окружают ум) переоценено IMO.

1
ответ дан Will Dean 27 November 2019 в 02:55
поделиться

при чтении "современного Дизайна C++", Вы поймете, что одноэлементный дизайн мог быть большим количеством комплекса, чем возврат статическая переменная.

1
ответ дан jab 27 November 2019 в 02:55
поделиться

Эта реализация прекрасна, пока можно ответить на эти вопросы:

  1. Вы знаете, когда объект будет создан (при использовании статического объекта вместо нового? У Вас есть основное ()?)

  2. делает Вас, одиночный элемент имеет какие-либо зависимости, которые не могут быть готовы к тому времени, когда он создается? При использовании статического объекта вместо нового какие библиотеки были инициализированы к этому времени? Что Ваш объект делает в конструкторе, который мог бы потребовать их?

  3. , когда это будет удалено?

Используя новый () более безопасно, потому что Вы управляете, где и когда объект будет создан и удален. Но тогда необходимо удалить его явно, и вероятно никто в системе не знает, когда сделать так. Можно использовать atexit () для этого, если он имеет смысл.

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

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

  1. постоянная блокировка в getInstance очень тяжела - полное контекстное переключение в каждом getInstance ()
  2. проверенная дважды блокировка сбои из-за оптимизации компилятора и модели памяти кэша / слабой модели памяти, очень хитро для реализации, и невозможный протестировать. Я не попытался бы сделать это в реальной системе, если Вы глубоко не знаете свою архитектуру и хотите, чтобы она была не портативна

, Они могут быть Погуглены легко, но здесь являются хорошей ссылкой на слабую модель памяти: http://ridiculousfish.com/blog/archives/2007/02/17/barrier .

Одно решение состояло бы в том, чтобы использовать блокировку, но потребовать, чтобы пользователи кэшировали указатель, который они получают от getInctance () и быть готовыми к getInstance () быть тяжелыми.

Другое решение состояло бы в том, чтобы позволить пользователям обработать потокобезопасность самим.

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

0
ответ дан n-alexander 27 November 2019 в 02:55
поделиться

Существует большая библиотека C++, ACE, на основе шаблонов. Существует много документации о другом виде шаблонов, так посмотрите на их работу: http://www.cs.wustl.edu/~schmidt/ACE.html

0
ответ дан mjk 27 November 2019 в 02:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: