Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2014, 20:15   #1
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию о статических членах

Как то задумался -в чем смысл объявления статических членов за пределами класса? Если бы этого правила не было, к каким коллизиям это могло привести?
SAMOUCHKA вне форума Ответить с цитированием
Старый 25.05.2014, 21:36   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
в чем смысл объявления статических членов за пределами класса?
В том же, в чем и смысл объявления нестатических членов.
Кстати, в пределах класса все методы будут inline - не всегда удачный вариант.
waleri вне форума Ответить с цитированием
Старый 25.05.2014, 22:06   #3
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Цитата:
Кстати, в пределах класса все методы будут inline - не всегда удачный вариант.
это я знаю.

Цитата:
В том же, в чем и смысл объявления нестатических членов.
ну и в чем тут смысл?
Код:
class MyClass
{
private:
static int static_val; // Для чего мне ее еще раз объявлять???
int val; // этот член за пределами объявлять не надо 
};

// По чему это не сделать в теле класса ?
int MyClass::static_val = 50;
SAMOUCHKA вне форума Ответить с цитированием
Старый 25.05.2014, 23:43   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Если MyClass у вас в файле MyClass.h то в каком obj модуле должна появится переменная? Вам надо явно указать .cpp модуль, в котором будет переменная.

Сравните с extern переменными - та же ситуация.
waleri вне форума Ответить с цитированием
Старый 26.05.2014, 01:05   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

SAMOUCHKA, ограничение языка.

Переменная должна существовать в какой то ед. трансляции.

переменная -член существует там, где был объявлен экземпляр класса.

статик-переменная класса не принадлежит экземпляру. Где же ей быть?

Она будет существовать там, где вы явно её определили.

Описанный вами способ объявления статических членов класса - ущербный способ. Поскольку инициализация статичического члена у вас зависит от порядка инициализации единиц трансляций.

Есть более безопасный и правильный способ работать со статик переменными:

Код:
class MyClass
{
private:
static int& GetSingelton(){ static int v = 10; return v; }
};
По стандарту, локальная статическая переменная будет проинициализирована один раз при первом вызове функции-хозяина.

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

Согласно с++11, этот способ так же безопасен в многопоточной программе.
_Bers вне форума Ответить с цитированием
Старый 26.05.2014, 16:36   #6
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

спасибо кажется дошло
SAMOUCHKA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Редактор статических отчетов. _Lamer_ WPF, UWP, WinRT, XAML 0 17.07.2012 11:59
Изображение двухмерных статических фигур Festt Помощь студентам 4 21.09.2011 03:22
перезагрузка статических операторов AndreyBS Общие вопросы C/C++ 10 12.05.2011 18:35
сортировка статических структур mego4el Помощь студентам 1 22.02.2011 23:17
Подключение статических библиотек к компоненту codeman Общие вопросы C/C++ 1 27.05.2009 22:04