Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [C++] Статичные члены класса.  (Прочитано 8451 раз)
0 Пользователей и 1 Гость смотрят эту тему.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« : 07-12-2009 14:53 » 

Привет Улыбаюсь

Если мне необходимо, чтобы все экземпляры класса А пользовались одними и теми же структурами данных - ни в коем случае каждый экземпляр не создавал копии этих структур, то эти структуры я объявляю как static члены - правильно?

Подскажите, пожалуйста, где и как мне инициализировать, а затем удалить статичные члены? Какие здесь применяются правила или приемы? Ведь, как я понял, нельзя инициализировать статичные члены в конструкторе? А уничтожать в деструкторе.
Главное избежать ситуации, в которой один их экземпляров класса попытался бы использовать не инициализированные статичные члены.
Может, хранить отдельный член (тоже статичный), который бы отслеживал все это?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 07-12-2009 15:00 » new

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

Инициализировать можно статически - в модуле класса.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 07-12-2009 15:08 » 

Статичные члены могут быть в секции private?
Тогда их уже нельзя инициализировать статически в модуле класса?
« Последнее редактирование: 07-12-2009 15:10 от The Nameless One » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 07-12-2009 15:14 » 

Ты можеш объявлять метод или переменную в классе статичным абсолютно в любой секции. Статичные переменные класса кстати нужно парковать. Иначе у тебя линковшик просто не соберет прогу.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 07-12-2009 15:17 » 

Что значит "парковать"?

Подозреваю, что статичные переменные нужно объявить глобально?

Все, я вроде бы все вспомнил - спасибо большое:))!
Просто еще не приходилось использовать статик-члены, а читал я про них сто лет назад.

Воде можно так сделать: создать статик-член int, который бы отслеживал количество экземпляров. Этот член увеличивался бы в конструкторе, а в деструкторе бы уменьшался, по нему можно и проверять, надо ли инициализировать статик-данные или овсобождать.
Улыбаюсь
« Последнее редактирование: 07-12-2009 15:34 от The Nameless One » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 08-12-2009 03:56 » 

со статическими мемберами класса всегда морока. Я для себя нашёл выход в использовании статической функции, вот как-то так:
Код:


class A
{
enum
{
e_return_current,
e_increment,
e_decrement,
};


public:
static  int st_Counter(int command=e_return_current)
{
static int Counter=0;

//синхронизация
... .Lock();


switch(command)
{
case e_increment:Counter++;break;
case e_decrement:Counter--;break;
}

//синхронизация
... .Unlock();

return  Counter;
}


A()
{
st_Counter(e_increment);
}

~A()
{
st_Counter(e_decrement);
}
};

A a;

int N=A::st_Counter();

N=a.st_Counter();


Записан

The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 08-12-2009 06:22 » 

Спасибо за информацию)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines