При попытке использовать где-либо метод, получаю от компайлера пиздюлей:
Оказывается я обязан ещё где-то объявить статический объект вне определения класса:
Зачем так сделано? Почему недостаточно в определении класса сообщить что у меня такой вот статический член класса используется и больше ничего не делать?
Потому что внутри объекта это declaration, а нужно ещё definition. Просто потому что для твоей переменной нужно выделить оперативу. Для не-статических переменных класса оператива выделяется когда создаётся экземпляр объекта. А статические есть вообще всегда, и должны где-то находиться в оперативе. При декларации же никакая оператива не выделяется, и физически до определения переменной есть тольео её упоминание, а её самой нет. Это как в plain c, можно объявить в скольки угодно модулях одну и ту же external var, но где-то в одном модуле она должна находиться объявленой.
Да, но зачем с точки зрения языка так поступать? Когда ты объявляешь статическую переменную - ты и говоришь компилятору, что она есть всегда и должна находиться "где-то в оперативе". К чему заставлять кодера делать эти излишние телодвижения? Для этого должна быть какая-то веская причина, которой я не вижу.
а её и нет. Концепция языка такая противоречивая. c++ fqa читал? в плюсах ещё навалом всяких странностей. Вот твой казус, если интересно http://yosefk.com/c++fqa/ctors.html#fqa-10.11
Re:[g++][член статический] Зачем так сделано?
Потому что внутри объекта это declaration, а нужно ещё definition. Просто потому что для твоей переменной нужно выделить оперативу. Для не-статических переменных класса оператива выделяется когда создаётся экземпляр объекта. А статические есть вообще всегда, и должны где-то находиться в оперативе. При декларации же никакая оператива не выделяется, и физически до определения переменной есть тольео её упоминание, а её самой нет. Это как в plain c, можно объявить в скольки угодно модулях одну и ту же external var, но где-то в одном модуле она должна находиться объявленой.
Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.04 (lucid) Firefox/3.6.17