Может ли статический член класса иметь тот же тип, что и класс, членом которого он является в C ++

скажем, у меня есть

class : foo
{
  public:
  static const foo Invalidfoo;
  foo();
  foo(int, string);
  private:
  int number;
  std::string name;
};

Это безопасно или склонно к возникновению каких-либо проблем?

РЕДАКТИРОВАТЬ :

Я хочу использовать это, чтобы возвращать недопустимый объект в качестве ссылки на ошибки запуска.


person DogDog    schedule 15.06.2011    source источник


Ответы (6)


Это совершенно законно, но лучше следующее:

class foo:
{
public:
    static const& foo Invalidfoo()
    {
        static foo Invalidfoo_;
        return Invalidfoo_;
    }

private:
      foo();
};

Таким образом вы гарантируете, что объект инициализируется при первом использовании.

Изменить: но независимо от того, как вы это делаете, у вас все еще есть глобальный объект, и это может быть причиной проблемы. Лучшим решением может быть вызов конструктора по умолчанию каждый раз, когда вам нужен созданный по умолчанию объект. По эффективности разница, наверное, ничтожна.

person Johan Råde    schedule 15.06.2011

Это законно.

На самом деле он широко используется в шаблоне singleton.

Проблемы с многопоточным доступом и созданием синглтонов.

Хорошая статья об этом:

C ++ и опасности двойной проверки блокировки

person Yochai Timmer    schedule 15.06.2011

Он просто действует как глобальная переменная или синглтон. Это склонно к проблемам, связанным с ними.

person Daniel A. White    schedule 15.06.2011

Это совершенно правильный код. У него нет причин вызывать какие-либо проблемы, потому что статические члены данных не влияют на размер класса. Независимо от того, сколько статических элементов данных вы определяете в классе, он не меняет свой размер ни на один байт!

struct A
{
   int i;
   char c;
};

struct B
{
   int i;
   char c;
   static A a;
   static B b;
};

В приведенном выше коде sizeof(A) == sizeof(B) всегда будет истинным. Смотрите эту демонстрацию:

Его поддерживает раздел $ 9.4.2 / 1 стандарта C ++ (2003 г.),

Статический член данных не является частью подобъектов класса. Существует только одна копия статического элемента данных, совместно используемого всеми объектами класса.

Вы не можете определить нестатический член данных включающего типа класса, потому что нестатические члены являются частями объекта и, таким образом, вносят свой вклад в размер класса. Это вызывает проблемы при вычислении размера класса из-за рекурсивного характера элементов данных.


См. Эту тему:

person Nawaz    schedule 15.06.2011

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

person Puppy    schedule 15.06.2011

Фактически так реализуется синглтон, за исключением того, что ваш статический член будет указателем. Так что да, вы в безопасности.

person MGZero    schedule 15.06.2011