Интересно, что статический член класса нельзя определить прямо в декларации класса:
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 комментариев:
А почему бы не объявить шаблон и переменную в одном пространстве имен?
Ага, поработайте с этой "статической переменной класса" из разных cpp-файлов.
Увидите весьма интересные эффекты.
Хотя виноват, проблемы были бы, если вместо "class foo" было бы "namespace foo".
Почему же нельзя? Можно. static int, например :)
> Почему же нельзя? Можно. static int, например :)
static _const_ int
Как я понимаю, приведенный пример - это решение для "static const std::string s('hello world');"? Иначе замена неравнозначная получается.
Извините, виноват. Ссылку на объект не разглядел :)
Спасибо за подсказку...
Еще один недостаток, раньше в отладчике были видны статик переменные, при этом методе не видны...
Почему так нельзя - смотреть у Эккеля "Thinking in C++" т.1. У меня это в главе 10, раздел статические члены в c++.
Хотя, если открывать доступ к статической переменной класса таким способом, да ещё и для стороннего функционала с правами на изменение, это просто призыв "ну, дайте же мне проблемы с единовременным доступом к переменной!".
> ...да ещё и для стороннего функционала с правами на изменение...
это private функция. или ты про что?
Неправильно интерпретировал слова о header-only классе. Подумал о продаваемой библиотеке.
Если этот член класса не меняется в процессе использования, то
static const
действительно будет лучше.
Отправить комментарий