Что плохого в использовании статического объекта-члена с классом? - PullRequest
7 голосов
/ 29 сентября 2010

Я слышал, что использование статических объектов-членов не очень хорошая практика.

Скажем, например, у меня есть такой код:

class Foo {
...
static MyString str;
};

Я определяю и инициализирую эту переменную вФайл реализации этого класса:

MyString Foo::str = "Some String"; // This is fine as my string API handles this.

Когда я запускаю этот код, я получаю предупреждение:

warning:'Foo::str' requires global construction.

У меня довольно много таких членов в моем классе, что такоелучший способ справиться с этим.

Спасибо,

Ответы [ 4 ]

10 голосов
/ 29 сентября 2010

Большинство аргументов против них такие же, как и для глобальных переменных:

  1. Порядок инициализации между различными блоками компиляции не определен.
  2. Порядок инициализации внутри одного модуля компиляции может повлиять на поведение & mdash; таким образом, может потребоваться нетривиальный порядок.
  3. Если конструктор выдает исключение, которое вы не можете перехватить, ваша программа завершается.

APPENDED: Для правильной обработки вы должны либо убедиться, что приведенные выше пункты не применимы к вашему коду, и игнорировать предупреждение, либо изменить дизайн вашей программы: вам действительно нужны статические? Почему бы не использовать const char* Foo::str = "Some String";?

3 голосов
/ 29 сентября 2010

Самая большая причина для беспокойства в этом примере заключается в том, что создание статического объекта-члена происходит до main(), а разрушение происходит после main() (или когда вы вызываете exit()).Пока что это хорошо.Но если в вашей программе есть несколько подобных объектов, вы рискуете ошибкой, когда код пытается использовать объект, который еще не был создан или уже был уничтожен.

C ++ FAQ Lite имеет некоторыеполезное обсуждение на эту тему, включая обходной путь / решение.Рекомендуемое чтение - вопросы с 10.14 по 10.18.10.17 наиболее применимо к вашему примеру.

2 голосов
/ 29 сентября 2010

Используя статический член, вы не гарантируете безопасность потока, представьте себе, что два потока пытаются получить доступ к статическому члену - теперь, что будет значением этого члена - будь то один из потока x или потока y, это также вызывает другойпобочный эффект, условия гонки, когда один поток изменяет статический элемент до завершения другого потока ... другими словами, использование статического члена может быть опасным ...

1 голос
/ 29 сентября 2010

В качестве примера требуется знать количество экземпляров класса.Это потребовало бы статического члена класса для отслеживания количества экземпляров.

Нет ничего плохого в наличии статического члена класса, если для решения проблемы требуется такой дизайн.Просто нужно позаботиться о мельчайших мелочах, как упоминалось в других постах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...