- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
void XmlElementHandler::startElement(
const XMLCh* const uri,
const XMLCh* const localname,
const XMLCh* const qname,
const XERCES_CPP_NAMESPACE_QUALIFIER Attributes& attrs
)
{
static XmlContext *context = XmlContext::getInstance();
static XmlParser *parser = XmlParser::getInstance();
я че-то неодупляю.
XmlContext и XmlParser singleton classы?
Да, переменные статические; да, живут после завершения функции-члена. Но они же прямо в самом начале без всяких условий слева от присваивания. С чего бы вдруг не выполнять ::getInstance()? Может быть объект по дороге убили, и указатель стал неверный... Как быть уверенным, что в какой-нибудь момент не потребуется действительно "пересоздать" объект?
Статические переменные, по стандарту, инициализируются нулём ещё до первого использования.
Здесь будет "="-присваивание, которое будет отрабатывать постоянно.
Единожды инициализированные и неизменные величины -- константы.
Статически переменные инициализируются нулем, если их не инициализировали явно.
Декларация, конечно же, отработает единожды.
В коде именно она.
Меня передёрнуло, прошу прощение.
Будет экономия от вызовов.
Прошу прощения.
это как бы основное свойство стачиский переменных что они сохраняют свое значение между вызовами функции. инициализировать их постоянно идет против смысла ихнего существования.
Objects with static storage duration (3.7.1) shall be zero-initialized (8.5) before any other initialization takes place.
Более того:
Every object of static storage duration shall be zero-initialized at program startup
XmlContext *context и XmlParser *parser я бы сделал static членами данных класса XmlElementHandler и добавил бы const перед *