член класса c ++ того же типа - PullRequest
       1

член класса c ++ того же типа

1 голос
/ 11 сентября 2011

У меня следующая ситуация:

class Foo
{
public:
  static const Foo memberOfFoo;

  ........
}

Так что дело в том, что я не могу инициализировать его в той же строке, где я его объявил, и я не могу инициализировать его через список инициализаций в конструкторе, кто-нибудь знает, что делать?

Ответы [ 3 ]

6 голосов
/ 11 сентября 2011

Поместите это вне определения класса, тогда:

const Foo Foo::memberOfFoo = whateverValue;

Это определение Foo::memberOfFoo, которое может предоставить инициализатор и должно быть в файле .cpp (как и любое другое определение объектов, оно может появляться только один раз во всей программе, в противном случае вы получите компоновщик ошибки).

Иногда вы можете найти код, который не имеет определений для своих статических элементов данных:

struct A {
  // sometimes, code won't have an "const int A::x;" anywhere!
  static const int x = 42;
};

Пропуск такого определения действителен, только если A::x никогда не берется по адресу и никогда не передается в ссылочные параметры. Более формальный способ сказать, когда допустимо опустить определение: «Когда все использования A :: x сразу читают сохраненное значение A :: x». Это касается многих статических целочисленных констант.

2 голосов
/ 11 сентября 2011

Статика класса, кроме константных целочисленных типов, должна / может быть инициализирована в точке определения.Вам нужно где-то объявить свой (не очень) memberOfFoo, добавив

const Foo Foo::memberOfFoo = /*construct here*/;
0 голосов
/ 11 сентября 2011

Вот как вы можете реализовать инициализацию ...

class Foo
{
public:
    static const Foo memberOfFoo;

    Foo(int, double)
    {
        ...
    };
};

const Foo Foo::memberOfFoo(42, 3.141592654);

...
...