В Java все находится в форме класса.
Если вы хотите использовать любой объект, тогда у вас есть две фазы:
Пример:
Object a;
a=new Object();
То же самое для концепции массива
Item i[]=new Item[5];
i[0]=new Item();
Если вы не дают секцию инициализации, тогда возникает NullpointerException
.
Можно постараться не должными быть удалить его при помощи статического объекта как это:
if(m_pA == 0) {
static A static_instance;
m_pA = &static_instance;
}
Почему все хотят возвратить одиночный элемент как указатель?
Возврат это, поскольку ссылка кажется намного более логичной!
Вы никогда не должны быть в состоянии освободить одиночный элемент вручную. Как Вы знаете, кто сохраняет ссылку на одиночный элемент? Если Вы не знаете (или не может гарантировать), ни у кого нет ссылки (в Вашем случае через указатель) тогда, у Вас нет бизнеса, освобождая объект.
Использование помехи в функциональном методе.
Это гарантирует, что создается и уничтожается только однажды. Это также дает Вам ленивую инициализацию бесплатно.
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
Одиночный элемент в C++ может быть записан таким образом:
static A* A::GetInstance() {
static A sin;
return &sin;
}
Просто не забывайте делать конструктора копии и операторы присваивания частными.
Я не думаю, что существует любая причина записать ту строку нет. Ваш метод деструктора не статичен, и Ваш одноэлементный экземпляр не будет разрушен тем способом. Я не думаю, что деструктор необходим, если Вам нужно к очистке, объект использует статический метод, у Вас есть созданный alread, FreeInstance ().
Кроме этого, Вы создаете свои одиночные элементы примерно тем же способом, которым я создаю мои.
После периода дикого энтузиазма по поводу одиночных элементов Meyers-стиля (использующий локальные статические объекты в качестве в некоторых предыдущих ответах), я устал полностью от пожизненных проблем управления в сложных приложениях.
я склонен находить, что Вы заканчиваете тем, что сослались на метод 'Экземпляра' сознательно рано в инициализации приложения, удостоверились, что они создаются, когда Вы хотите, и затем играющий все виды игр с разрушением из-за непредсказуемого (или по крайней мере очень сложный и несколько скрытый) порядок, в котором уничтожаются вещи.
YMMV, конечно, и это зависит немного от природы самого одиночного элемента, но много вафли об умных одиночных элементах (и проблемы поточной обработки/блокировки, которые окружают ум) переоценено IMO.
при чтении "современного Дизайна C++", Вы поймете, что одноэлементный дизайн мог быть большим количеством комплекса, чем возврат статическая переменная.
Эта реализация прекрасна, пока можно ответить на эти вопросы:
Вы знаете, когда объект будет создан (при использовании статического объекта вместо нового? У Вас есть основное ()?)
делает Вас, одиночный элемент имеет какие-либо зависимости, которые не могут быть готовы к тому времени, когда он создается? При использовании статического объекта вместо нового какие библиотеки были инициализированы к этому времени? Что Ваш объект делает в конструкторе, который мог бы потребовать их?
, когда это будет удалено?
Используя новый () более безопасно, потому что Вы управляете, где и когда объект будет создан и удален. Но тогда необходимо удалить его явно, и вероятно никто в системе не знает, когда сделать так. Можно использовать atexit () для этого, если он имеет смысл.
Используя статический объект в средствах метода, которые делают не действительно, знают, когда он будет создан или удален. Вы могли также использовать глобальный статический объект в пространстве имен и избежать getInstance () вообще - он не добавляет много.
при использовании потоков, тогда Вы находитесь в большой проблеме. Фактически невозможно создать применимый ориентированный на многопотоковое исполнение одиночный элемент в C++ из-за:
, Они могут быть Погуглены легко, но здесь являются хорошей ссылкой на слабую модель памяти: http://ridiculousfish.com/blog/archives/2007/02/17/barrier .
Одно решение состояло бы в том, чтобы использовать блокировку, но потребовать, чтобы пользователи кэшировали указатель, который они получают от getInctance () и быть готовыми к getInstance () быть тяжелыми.
Другое решение состояло бы в том, чтобы позволить пользователям обработать потокобезопасность самим.
еще одно решение состояло бы в том, чтобы использовать функцию с простой блокировкой и заменить ею с другой функцией, не блокируя и проверяя, как только новое () назвали. Это работает, но полное внедрение является сложным.
Существует большая библиотека C++, ACE, на основе шаблонов. Существует много документации о другом виде шаблонов, так посмотрите на их работу: http://www.cs.wustl.edu/~schmidt/ACE.html