![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Igor_K |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 4.2.2008 Где: Kyiv Репутация: нет Всего: нет |
Всем привет!
Только сильно не бейте Мне нужно както объявить глобальные переменные для функций. На пхп я бы сделал так:
в функции myfunct я создаю переменную $my_var. Потом вызываю функцию funct(). В функции funct() переменная $my_var обявлена как глобальная (global $my_var;) и к ней есть доступ. Так от вопрос как такое можно сделать в С++ ? То есть я в функции main() объявляю некоторые переменные, потом вызываю какуюту функцию и в ней имею доступ к переменным созданным в main(). Такое возможно в С++ ? Помогите пожалуйста разобраться с этим Спасибо за помощь! |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
но глобальные переменные это не есть гуд. |
|||
|
||||
| xvr |
|
||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
- Попробуй сынок малинки. - У! Вкусно, как Орбит малина! main.h
main.cpp
?.*
|
||||||||||||
|
|||||||||||||
| Igor_K |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 4.2.2008 Где: Kyiv Репутация: нет Всего: нет |
Такой подход я знаю. Но мне он не подходит. Мне именно нужно создать определенные переменные в одной функции и потом их юзать в других. |
||||
|
|||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
Добавлено @ 14:44
так нельзя можно создать функцию возвращающую значение которое можно присвоить глобальной переменной. Это сообщение отредактировал(а) mrbrooks - 4.5.2008, 14:47 |
|||
|
||||
| Rififi |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
Переменные, определённые внутри функции видны только в этой функции (это правило распростряняется на любой блок видимости (scope)). Выход - использовать более правильные методы (singletone etc) или отказаться от C++ |
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Можно реализовать функциональность таких переменных, но синтаксически это будут не совсем переменные. |
||||||
|
|||||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Например так :
основной недостаток вышеприведенного примера это использование строк как имен переменных - не будет контроля со стороны компилятора для повышения производительности лучше использовать как в функции f2() строковые имена "видны" только в пределах специализации шаблона для каждого типа, то есть для разных типов одно и то же имя обозначает разные переменные. вышеприведенное только набросок -до ума доводите сами )) Желаю успехов )) Это сообщение отредактировал(а) mes - 5.5.2008, 00:48 |
||||||
|
|||||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
имхо, если 2 функции так сильно связанны друг с другом, что используют одинаковые "глобальные" переменные, то они должны быть в одном классе (переменные-члены которого и будут являться "глобальными" для этих двух функций)
а вообще нужно смотреть по ситуации и насчет динамических переменных способ, предложенный mes'ом, конечно, выход из затруднения, но в с++ таким злоупотреблять не стоит Это сообщение отредактировал(а) Alek86 - 5.5.2008, 09:35 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
если ты знаешь какие переменные будут использованы в функции то зачем тебе создавать их динамически?? на php каждый модуль самостоятельный и использует виртуальное (предоставляемое интерпретатором программе в рантайме) глобальное простансво для обмена данных и как следствие этого динамические глобальные переменные . На С++ есть линкер который собирает программу до ее запуска и проверяет и отводит в программе место для глобальных перемменных и как результат отсутсвие "реальных" динамических перемеенных. ИМХО: Я вижу это различие, как преимущество С++ потому, что он предупредит о всех колизиях переменных, когда как в пхп это ложится на программиста. Исходя из вышеперечисленного я не могу представить, когда нужны ()действительно полезны) динамические переменные в С++, - поэтому был бы рад если бы кто нибудь мне привел такой пример (в одной теме я уже пытался выяснить, но так и не добился) Это сообщение отредактировал(а) mes - 5.5.2008, 20:01 |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
смотря что именно ту понимаешь под "динамическими" есть такой тип - boost::any - можешь поискать примеры его использования в самом бусте (я видел в program_options) или по форумам |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
В данном случае слово "динамическое" не подходит. Имелось ввиду это :
Сам бы хотел понять что именно хотят получить этим (потому что уже не первый раз спрашивают) )) Какой смысл декларировать переменные для одних функций в какой то другой функции ?? Не.. это совсем не то..)) вопрос ставиться не о типе, а о самой переменной |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
думаю просто люди привыкли писать в интерпретируемом, где свободы намного больше потому и удивляются, как в С++ "неудобно" |
|||
|
||||
| Igor_K |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 4.2.2008 Где: Kyiv Репутация: нет Всего: нет |
Ну я просто привык в пхп так делать. В пхп если програмить процедурно то имхо без глобальных переменных не обойтись. И в с++ я тоже хочю так сделать, потомучто по другому не мыслю как делать. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Была такая машина - 'Эльбрус 2', и был у нее язык програмирования 'Эль 76', весь насквозь динамический, при описании переменной указывался только ее размер, содержимое же переменной (целое, плавающее или указатель) определялось динамически на этапе выполнения (прямо boost::any). Казалось бы очень удобно, очень гибко и динамично, гип-гип ура! Увы, эта гибкость обернулось ОГРОМНЫМ недостатком - если компилятор C/C++ способен найти несоотвествие типов уже на этапе компиляции (причем все), то на Эльбрусе эти несоотвествия вываливались run-time (причем по мере хождения по этим граблям). И не было никакой гарантии, что не осталось каких нибудь несоотвествий типов (просто потому, что по этому месту не прошли). Явная динамика типов была нужна КРАЙНЕ редко. В следующей версии Эль 76 были добавлены статические описания типов. |
|||
|
||||
| mes |
|
||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну если нужны глобальные переменные , в cpp ничего не мешает их использовать.. также как и процедурный стиль
В примере обшая переменная для двух функций храняшихся в разных файлах . Единственное отличие oт примера на php - декларация вне фунциии; Вот и вопрос чем не устраивает такой подход и почему надо обязательно иметь возможность декларировать глобальные переменные в фунции ?? Тогда тебе придется рисовать круги от руки как карандашом, несмотря на то что ты держишь циркуль ))
тут дело не в свободе, а в способе мышления.. Тот кто не пользовался с трудом осознает всю силу строгой типизации )) Добавлено через 6 минут и 55 секунд
вот за это я не люблю отсутствие строгой типизации.. почему я должен следить за этим , когда эти соответствия может проверить какой нибудь простой автомат... Это сообщение отредактировал(а) mes - 6.5.2008, 16:27 |
||||||||
|
|||||||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
у меня когда-то были подобные потребности возможно потому, что глобальная переменная должна быть видна только в 2х функциях и ни в каких других |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
хм... так а что мешает вызвать ту же переменную в третьей функции ведь область видимости нигде не прописана... Добавлено через 2 минуты и 14 секунд хотя как раз эту задачу (ограничение области видимости до двух функций) можно решить с помощью friend: создаём глобальный экземпляр класса, в котором в закрытой секции прописана эта переменная и делаем две выбранных функции его друзьями таким образом без изменения этого класса не получится доступиться к этой переменной откуда-то кроме этих двух функций Добавлено через 3 минуты и 26 секунд хотя это, конечно, для того случая, если есть причины не создавать класс, в котором будут эти функции (т.к. налицо нечто общее между ними) -------------------- qqq |
|||
|
||||
| opjox |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 17.1.2008 Репутация: 1 Всего: 14 |
На C/C++ это лучше сделать и вовсе без глобальных переменных:
Приведи конкретный пример.
namespace? |
||||||
|
|||||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Что-т в последнее время много тем, по сути сводящиеся к вопросу: "почему С++ не позволяет делать то, что делается в скриптовых языках...".
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
неймспейс хорошо, а класс - лучше, ибо переменную можно приватной сделать и все - никакой using namespace ничего плохого не сделает |
|||
|
||||
| Igor_K |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 4.2.2008 Где: Kyiv Репутация: нет Всего: нет |
Ага. тупая моя башка
Про ООП в С++ я ваще ничего не шарю, еще не дорос. Так что ничего написать не могу. Добавлено через 4 минуты и 18 секунд И еще мне не понравилось в С++ что функция не может массив возвращать :( Это сообщение отредактировал(а) Igor_K - 7.5.2008, 22:49 |
|||
|
||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Ты не понял. На самом деле все зависит от способа передачи параметров. Можно передать так, что в вызывающей ничего не изменится (по значению), а можно и так, что изменится (по ссылке или по указателю):
|
||||
|
|||||
| Rififi |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
И еще мне не понравилось в С++ что функция не может массив возвращать :(
в C++ это и не нужно. |
|||
|
||||
| opjox |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 17.1.2008 Репутация: 1 Всего: 14 |
Так я про способ скрытия глобальных переменных, не переводя их в другую категорию. А так, согласен, класс лучше, но все же не всегда – создавать экземпляр класса для вызова всего одной функции, для которой нужно укрыть переменные, на мой взгляд, не слишком хорошо. Вдобавок, практически всегда можно свести глобальные переменные к локальным, передаваемым через параметр функции. Неименованному пространству имен никакой using не сделаешь
Это смотря как передашь.
Это сообщение отредактировал(а) opjox - 9.5.2008, 00:34 |
||||||
|
|||||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Для QList (и прочие кутешные классы) вполне нормально возвращать коллекцию. Копируется только внутренний указатель (при изменении, если несколько физических объектов владеют этим указателем - делается копия коллекции). |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Примечание: это относится только к объектам реализованным в стиле COW (copy_on_write) Это сообщение отредактировал(а) mes - 8.5.2008, 20:57 |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
static а вообще надо смотреть по ситуации ага оно включено во всей cpp-шке и так - то есть ВСЕ функции могут попортить переменную |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
вот этоочень нехорошо: адрес, записанный в p=new... будет потерян при выходе из функции нужно передавать p по ссылке -------------------- qqq |
|||
|
||||
| opjox |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 17.1.2008 Репутация: 1 Всего: 14 |
Вижу, голова вчера не варила как надо.
Вчера забыл про него совершенно.
Недожал «&», просмотрел. Благодарю, что указали на ошибку, сейчас исправлю. -------------------------------------------------- Солидарен
Ну так и выделяем эти функции в отдельный файл |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |