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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатель на статическую внутреннюю переменную 
:(
    Опции темы
Random13
Дата 4.12.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Такой вопрос.
Видел как один чел использовал в программе указатель на статическую переменную из функции.
То есть есть просто функция (не метод) в одном из файлов проекта. Он из нее возвращает указатель на внутреннюю статическую переменную. Я у себя проверил - работает. Функцию имплементировал в одном из файлов проекта, в другом в мэйн ее использовал.
В связи с этим вопрос - не понятно. Есть ли это в ANSI С, то есть работает ли во всех компиляторах ?
То есть по своему назначению внутренняя статическая переменная служит для нужд функции, но никак не для работы наруже. Вообще есть правило, что область видимости статической переменной ограничивается файлом, где она объявлена. Получается, что передавая на нее поинтер это правило можно обойти, и вообще сливается грань между внутренней и глобальной статической переменной.
Я пришел к мнению, что использовать такое, наверное, можно, но не корректно...
Кто что думает - интрересно почитать.
PM MAIL   Вверх
zkv
Дата 4.12.2007, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



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

const std::string &ApplicationPath()
{
  static std::string path;
  if( path.empty() )
  {
   //единожды инициализируется 
   }
   return path;
}

PM MAIL   Вверх
Lazin
Дата 4.12.2007, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Так часто реализуют шаблон проектирования "синглтон"
Код

Object* QuerySingleton()
{
    static Object singleton;
    return &singleton;
}

PM MAIL Skype GTalk   Вверх
zkv
Дата 4.12.2007, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(Lazin @  4.12.2007,  13:35 Найти цитируемый пост)
Так часто реализуют шаблон проектирования "синглтон"

это только один из вариантов
PM MAIL   Вверх
Fazil6
Дата 4.12.2007, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Цитата(Random13 @  4.12.2007,  13:24 Найти цитируемый пост)
В связи с этим вопрос - не понятно. Есть ли это в ANSI С, то есть работает ли во всех компиляторах ?

это служит намного более удобным заменителем глобальной переменной
Цитата(Random13 @  4.12.2007,  13:24 Найти цитируемый пост)
То есть по своему назначению внутренняя статическая переменная служит для нужд функции, но никак не для работы наруже.

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

PM MAIL   Вверх
Random13
Дата 4.12.2007, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В этом варианте все в порядке - там возвращается статическая переменная класса, а не внутренняя переменная метода.
Нигде в литературе не видел, чтобы возвращалась внутренняя статическая.
PM MAIL   Вверх
zkv
Дата 4.12.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(Random13 @  4.12.2007,  13:59 Найти цитируемый пост)
В этом варианте все в порядке - там возвращается статическая переменная класса, а не внутренняя переменная метода.

в каком варианте?
PM MAIL   Вверх
Random13
Дата 4.12.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В твоем

Добавлено @ 14:19
Цитата(zkv @ 4.12.2007,  13:39)
Цитата(Lazin @  4.12.2007,  13:35 Найти цитируемый пост)
Так часто реализуют шаблон проектирования "синглтон"

это только один из вариантов



Это сообщение отредактировал(а) Random13 - 4.12.2007, 14:20
PM MAIL   Вверх
Fazil6
Дата 4.12.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Цитата(Random13 @  4.12.2007,  13:59 Найти цитируемый пост)
В этом варианте все в порядке - там возвращается статическая переменная класса, а не внутренняя переменная метода.Нигде в литературе не видел, чтобы возвращалась внутренняя статическая.



Цитата(Random13 @  4.12.2007,  13:24 Найти цитируемый пост)
Видел как один чел использовал в программе указатель на статическую переменную из функции.То есть есть просто функция (не метод) в одном из файлов проекта. Он из нее возвращает указатель на внутреннюю статическую переменную. Я у себя проверил - работает. Функцию имплементировал в одном из файлов проекта, в другом в мэйн ее использовал.

ну вот увидел.
PM MAIL   Вверх
Random13
Дата 4.12.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если я увидел, что кто-то, что то делает - то не значит, что это правильно и корректно и везде будет работать.
В литературе по этому поводу ничего не читал никогда.
PM MAIL   Вверх
Fazil6
Дата 4.12.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Цитата(Random13 @  4.12.2007,  15:07 Найти цитируемый пост)
Если я увидел, что кто-то, что то делает - то не значит, что это правильно и корректно и везде будет работать.

тебе же сказали - вполне юзабельное решение. Ничего неправильного с точки зрения языка в таком варианте реализации нет
PM MAIL   Вверх
Earnest
Дата 4.12.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(Random13 @  4.12.2007,  16:07 Найти цитируемый пост)
В литературе по этому поводу ничего не читал никогда. 

Возврат ссылки или указателя на статическую переменную, объявленную внутри функции совершенно корректен.
На конкретный пункт стандарта сослаться не могу, но и в литературе ссылки встречаются. Например, у Майерса или у Саттера. Или описание реализации синглетона из книги банды четырех.

Более того, это шикарный прием для обхода проблемы "инициализации вовремя": как известно, порядок инициализации нормальных (внешних) глобальных или статических переменных из разных единиц компиляции неопределен. И легального способа добиться, чтобы переменная A была инициализирована гарантированно раньше переменной B не существует - если они в разных модулях. 

Т.е. мы получим проблему, если инициализация A зависит от B.
А если вместо глобальной переменной мы используем ссылку на статическую переменную внутри функции, то она гарантированно будет инициализирована ровно в момент первого вызова - т.е. когда нам надо. И это стандарт гарантирует.


--------------------
...
PM   Вверх
zkv
Дата 4.12.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(Random13 @  4.12.2007,  15:07 Найти цитируемый пост)
В литературе по этому поводу ничего не читал никогда. 

В литературе обо всем не напишешь, можно еще и голову применять. 
К тому же тебе показали два примера, объяснили достоинства подхода, что еще нужно?
PM MAIL   Вверх
Random13
Дата 4.12.2007, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А я скажу, что - это некорректно.
Мало кто чего говорит. Ну недоверчивый я такой, когда дело идет о таких вещах.
Мне бы почитать где об этом. На душе бы полегчало.  smile 
PM MAIL   Вверх
bsa
Дата 4.12.2007, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Random13, тебе сказали, где читать.
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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