Я привел вариант решения и спросил так - это Singleton или не Singleton. Я приследовал определенные цели и я их достиг.
По поводу комбинации с Exception, хочу сказать:
Повторюсь, я точно также как в варианте с классом содержащим static instance() мог бы выдавать ошибку при попытке вызова конструктора, но я показал как можно вернуть указатель на объект в результате "ошибки". Это ситуация может возникуть по причине того, что вы элементарно могли забыть создавали вы или не создавали Singleton.
Обработка ошибки позволила продемонстрировать несколько примеров последовательно, что при выдачи ошибки было бы затруднительно.
По поводу С++ кода.
Я достаточно хорошо разбираюсь в С++.
Для меня, приведеный выше код, может проявить уважение к Вам, но как пример кода - это сложный неудобочитаемый кусок. Если бы так все книги объясняли теорию, я думаю никто С++ не выучил.
Хочу заметить - практически без ошибок.
У меня стоит gcc 3.2 все скомпилировалось в полтычка.
Я СОГЛАСЕН, Я БЫЛ НЕ ПРАВ – С++ ДОПУСКАЕТ ВЫЗОВ STATIC МЕТОДА БЕЗ СОЗДАНИЯ ОБЪЕКТА.
Правда они автоматически создаются (при компиляции) как глобальные с ограничением области видимости.
А вот теперь посмотрите к чему Ваш код может случайно привести:
int
main() {
Foo* mfoo=NULL; // Условно, мы забыли инициализровать mfoo.
Foo::set(mfoo);
Foo* l_foo = Foo::get();
l_foo->doSomething();
delete Foo::reset();
}
И это работает
Я думаю комментарии излишни.
Повторюсь, я не против static переменных, но против static методов и вот одна из причин почему:
Источник http://citforum.nis.nnov.su/SE/project/pattern/p_2.shtml#3.3.2
Выдержка:
Разумнее создавать именно статический экземпляр специального класса, а не объявить требуемые методы статическими, поскольку при использовании методов экземпляра можно применить механизм наследования и создавать подклассы. Статические методы в языках программирования не полиморфны и не допускают перекрытия в производных классах.
Решение на основе создания экземпляра является более гибким, поскольку впоследствии может потребоваться уже не единственный экземпляр объекта, а несколько.
.
Я считаю, что в данном варианте это звучит так:
#include <iostream>
class A {
public:
A* instance() {return this;}
};
class B {
private:
static A* myA;
public:
B(){if (myA==NULL){ myA=new A; }; }
~B(){if (myA!=NULL){ delete myA; }; }
};
A* B::myA=NULL;
int
main() {
return 0;
}
В PHP так:
<?php
class A {
function instance() {return this;}
}
class B {
private static $myA=NULL;
function B() {
if ( is_null($myA) ) $myA = new A();
}
}
?>
По поводу Exception и конструкторов, почитайте :
http://uic.rsu.ru/doc/programming/c++/straustrup/cpptut.html
Бьерн Страуструп. Язык программирования С++
9.4.4 Особые ситуации и конструкторы
9.5 Особые ситуации могут не быть ошибками