Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "Составная"инициализация статических членов класса, Неразовая(многоступенчатая)инициализация 
V
    Опции темы
nobody0
  Дата 29.3.2011, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 20.12.2010

Репутация: нет
Всего: нет



Здравствуйте.

Есть, к примеру, такой примитивный класс:
Код

class A
{
    static int v;
};


Необходимо статическую переменную v класса A инициализировать. Причем непросто присвоить какое-то начальное значение, а посредством некоторых манипуляций (через циклы, неоднократное присваивание, пока не выйдет конечный результат). Как это реализовать грамотно в заголовочном файле с классом? Чтобы эта переменная к моменту создания первого объекта класса была инициализирована так, как хочется.

Пробовал "напролом" после класса писать нужный код, к примеру,
Код

int A::v  = 0;
for (int i = 0; i < 10; ++i)
{
    A::v |= (1 << i);
}

Но компилятору это не нравится (подчеркивается цикл еще до момента компиляции, пишет: "требуется объявление")

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

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

И еще интересно такое: как аналогично инициализировать статическую константную переменную через какую-то временную? Т.е. то же, чтобы нужные присвоения произошли до создания объекта класса (вся эта функция по присвоению временной переменной нужных значений, а после один раз инициализируется статическая константа)? Так как в процессе программы эта статическая переменная никогда не будет меняться (и не должна, т.к. не предполагается полет программы в прямом смысле с одной машины на другую без прерывания ее работы).

Заранее благодарен за любую информацию, в том числе упоминания какой-либо подходящей литературы или статей.

Это сообщение отредактировал(а) nobody0 - 29.3.2011, 22:39
PM   Вверх
mes
Дата 29.3.2011, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Код

struct A
{
  static int si;
  static int calc_si ();
};

int A::si = calc_si ();

int A::calc_si ()
{
    int k=0; 
    for (int i=0; i<10; ++i) ++k;

    return  k;
}


если компилятор свежий, можно лямбдой:
Код

struct A
{
  static int si;
};

int A::si = []() {
    int k=0; 
    for (int i=0; i<10; ++i) ++k;
    
    return k;
}();


Это сообщение отредактировал(а) mes - 29.3.2011, 23:01


--------------------
PM MAIL WWW   Вверх
nobody0
Дата 30.3.2011, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 20.12.2010

Репутация: нет
Всего: нет



mes
спасибо огромное!
Точно же, ведь переменной можно присвоить функцию, вернее, то, что она возвращает. Отлично, теперь спокойно можно делать статическую константу в классе. Спасибо.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0581 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.