статическая константа в структуре с использованием конструктора - PullRequest
0 голосов
/ 27 января 2012

Я искал метод для инициализации статического числа с плавающей точкой внутри структуры, НО, используя конструктор структуры.На этом сайте уже есть решение для инициализации значения, но мне не удалось найти решение, которое явно использует конструктор.

Идея заключается в следующем:

struct test {
  static const float a;
  int b;
  test(int bb, float a);
};

test::test(int bb, float aa) {
  b=bb;
  a=aa;
}

int main() {
  int bval=2;
  float aval=0.25;
  struct test aaa(bval, aval);
  return 0;
}

Как его реализоватьправильно?Спасибо за любой совет.

Ответы [ 3 ]

1 голос
/ 27 января 2012

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

const float test::a = something;

За пределами класса (в одном модуле компиляции).Тем не менее, вы можете делать то, что написали, и это установит переменную в значение, которое вы передаете.

Если вы хотите установить его только при первом вводе конструктора,вы можете (но не должны) делать что-то вроде

test::test(int bb, float aa){
    static float _unused = (test::a = aa);

    b=bb;
}

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

0 голосов
/ 27 января 2012

Вы не можете инициализировать статическую переменную const внутри конструктора.

Вы должны инициализировать при объявлении

static const float a = 3.1416f;

Убедитесь, что вы понимаете ключевое слово const.И должно быть цельным.

0 голосов
/ 27 января 2012

Статические члены не связаны с конкретным экземпляром, поэтому они будут инициализированы только один раз. Конструкторы, с другой стороны, вызываются отдельно для каждого экземпляра, поэтому делать то, что вы пытаетесь, не имеет смысла.

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

Стоит мимоходом заметить, что другие языки (например, Java) имеют концепцию статического конструктора именно для такого рода вещей, а в C ++ нет.

При этом вам может показаться интересным следующий вопрос:

статические конструкторы в C ++? Мне нужно инициализировать частные статические объекты

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