16 июля 2009

Static member definition

Интересно, что статический член класса нельзя определить прямо в декларации класса:
class foo
{
static std::string s('hello world');
};
А иногда сильно этого хочется - например в декларации шаблона. Или просто в каком-нибудь header-only классе. Самое интересное, что внутри функции такое провернуть можно. Поэтому можно сделать финт ушами - сделать доступ к статическому члену через member-функцию:
class foo
{
static std::string &s()
{
static std::string impl('hello world');
return impl;
}
};
Синтаксис при обращении немного поменяется - s() вместо s, но часто оно того стоит.

12 комментариев:

Ilya Kulakov комментирует...

А почему бы не объявить шаблон и переменную в одном пространстве имен?

Qehgt комментирует...

Ага, поработайте с этой "статической переменной класса" из разных cpp-файлов.

Увидите весьма интересные эффекты.

Qehgt комментирует...

Хотя виноват, проблемы были бы, если вместо "class foo" было бы "namespace foo".

Sergey Kishchenko комментирует...

Почему же нельзя? Можно. static int, например :)

Ilya Kulakov комментирует...

> Почему же нельзя? Можно. static int, например :)
static _const_ int

White Knight комментирует...

Как я понимаю, приведенный пример - это решение для "static const std::string s('hello world');"? Иначе замена неравнозначная получается.

White Knight комментирует...

Извините, виноват. Ссылку на объект не разглядел :)

Pushkoff комментирует...

Спасибо за подсказку...

Еще один недостаток, раньше в отладчике были видны статик переменные, при этом методе не видны...

Константин Казимиров комментирует...
Этот комментарий был удален автором.
Константин Казимиров комментирует...

Почему так нельзя - смотреть у Эккеля "Thinking in C++" т.1. У меня это в главе 10, раздел статические члены в c++.

Хотя, если открывать доступ к статической переменной класса таким способом, да ещё и для стороннего функционала с правами на изменение, это просто призыв "ну, дайте же мне проблемы с единовременным доступом к переменной!".

Raider комментирует...

> ...да ещё и для стороннего функционала с правами на изменение...

это private функция. или ты про что?

Константин Казимиров комментирует...

Неправильно интерпретировал слова о header-only классе. Подумал о продаваемой библиотеке.

Если этот член класса не меняется в процессе использования, то
static const
действительно будет лучше.