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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глобальные переменные, как в PHP 
V
    Опции темы
Igor_K
Дата 4.5.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет!

Только сильно не бейте smile 
Мне нужно както объявить глобальные переменные для функций. На пхп я бы сделал так:
Код

function myfunct()
{
    $my_var = true;

    funct();
}

function funct()
{
    global $my_var;
    if ($my_var) echo 'Привет!';
}


в функции myfunct я создаю переменную $my_var. Потом вызываю функцию funct(). В функции funct() переменная $my_var обявлена как глобальная (global $my_var;) и к ней есть доступ.

Так от вопрос как такое можно сделать в С++ ? 
То есть я в функции main() объявляю некоторые переменные, потом вызываю какуюту функцию и в ней имею доступ к переменным созданным в main(). Такое возможно в С++ ? Помогите пожалуйста разобраться с этим smile 

Спасибо за помощь!  smile 
PM MAIL   Вверх
vinter
Дата 4.5.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(Igor_K @  4.5.2008,  15:22 Найти цитируемый пост)
То есть я в функции main() объявляю некоторые переменные, потом вызываю какуюту функцию и в ней имею доступ к переменным созданным в main(). Такое возможно в С++ ?

нет, только как аргументы передавать


--------------------
Мой блог
PM MAIL WWW   Вверх
mrbrooks
Дата 4.5.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Код

int a;
void b();
main()
{
b();
}

void b()
{
a = 100;
}



но глобальные переменные это не есть гуд.
PM MAIL   Вверх
xvr
Дата 4.5.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Igor_K @ 4.5.2008,  14:22)
Всем привет!

Только сильно не бейте smile 
Мне нужно както объявить глобальные переменные для функций. На пхп я бы сделал так:
Код

function myfunct()
{
    $my_var = true;

    funct();
}

function funct()
{
    global $my_var;
    if ($my_var) echo 'Привет!';
}


в функции myfunct я создаю переменную $my_var. Потом вызываю функцию funct(). В функции funct() переменная $my_var обявлена как глобальная (global $my_var;) и к ней есть доступ.

Так от вопрос как такое можно сделать в С++ ? 

- Попробуй сынок малинки.
- У! Вкусно, как Орбит малина!

main.h
Код

extern bool my_var;


main.cpp
Код

bool my_var;


?.*
Код

#include "main.h"

void funct()
{
 if (my_var) cout<<"Перевед!" << endl;
}

void myfunct()
{
 my_var=true;
 funct();
}

Цитата

То есть я в функции main() объявляю некоторые переменные, потом вызываю какуюту функцию и в ней имею доступ к переменным созданным в main(). Такое возможно в С++ ? 
К динамически созданным переменным? Нет - С++ компилятор, он не умеет создавать переменные динамически

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


Бывалый
*


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

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



Цитата(mrbrooks @ 4.5.2008,  14:32)
Код

int a;
void b();
main()
{
b();
}

void b()
{
a = 100;
}



но глобальные переменные это не есть гуд.

Такой подход я знаю. Но мне он не подходит. Мне именно нужно создать определенные переменные в одной функции и потом их юзать в других. 
PM MAIL   Вверх
mrbrooks
Дата 4.5.2008, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Добавлено @ 14:44
Цитата

Такой подход я знаю. Но мне он не подходит. Мне именно нужно создать определенные переменные в одной функции и потом их юзать в других.


так нельзя

можно создать функцию возвращающую значение которое можно присвоить глобальной переменной.

Это сообщение отредактировал(а) mrbrooks - 4.5.2008, 14:47
PM MAIL   Вверх
Rififi
Дата 4.5.2008, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата
Мне именно нужно создать определенные переменные в одной функции и потом их юзать в других.  

Переменные, определённые внутри функции видны только в этой функции (это правило распростряняется на любой блок видимости (scope)). Выход - использовать более правильные методы (singletone etc) или отказаться от C++
PM MAIL   Вверх
xvr
Дата 4.5.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Igor_K @ 4.5.2008,  14:35)
Цитата(mrbrooks @ 4.5.2008,  14:32)
Код

int a;
void b();
main()
{
b();
}

void b()
{
a = 100;
}



но глобальные переменные это не есть гуд.

Такой подход я знаю. Но мне он не подходит. Мне именно нужно создать определенные переменные в одной функции и потом их юзать в других.

Можно реализовать функциональность таких переменных, но синтаксически это будут не совсем переменные.
PM MAIL   Вверх
mes
Дата 4.5.2008, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Igor_K @  4.5.2008,  14:35 Найти цитируемый пост)
. Мне именно нужно создать определенные переменные в одной функции и потом их юзать в других


Цитата(xvr @  4.5.2008,  18:55 Найти цитируемый пост)
Можно реализовать функциональность таких переменных, но синтаксически это будут не совсем переменные.


Например так :
Код


#include <iostream>
#include <string>
#include <map>

using namespace std;


template <class T> class GlobalVar
{
    public:
       GlobalVar (const string& name) : m_name(name) { CreateIfNeed (m_name);     }
       T& operator()() { return GetMap()[m_name]; }
       static T& Value (const string& name) { CreateIfNeed (name); GetMap()[name];  }
       static bool isValue (const string& name)  { return (GetMap().count(name)!=0); }

    protected:
      static void CreateIfNeed (const string& name) { if (GetMap().count(name)==0) GetMap()[name]=T(); }// создаем, если нет такой переменной            

      typedef map<string, T> Map;
      inline static Map& GetMap () { static Map m_map; return m_map;}

    private:
        string m_name;

};


typedef GlobalVar<string> GlobalString;

void f1()
{
    GlobalString a("var1");
    a()+=" Hello ";
};
void f2()
{
    string &b = GlobalString::Value("var1");
    b+=" World ";
};
void f3()
{
    GlobalString::Value("var1")+=" ! ";
};

void PrintMyGlobalVar(const string& name )
{
     (GlobalString::isValue(name))? std::cout<<GlobalString::Value(name) << endl
                                  : std::cout<< "Not created" << endl;
};

int main(int argc, char *argv[])
{

      std::cout << "before: "; PrintMyGlobalVar ("var1");

      f1(); f2(); f3();

      std::cout << "after: "; PrintMyGlobalVar ("var1");

    system("PAUSE");
    return EXIT_SUCCESS;
}



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


Это сообщение отредактировал(а) mes - 5.5.2008, 00:48


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



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

Код

class Class {

public:
 void myfunct() {
    my_var = true;
    funct();
 }

 void funct() {
    if (my_var) cout << "Привет!";
 }
private:
bool my_var;
}

а вообще нужно смотреть по ситуации

и насчет динамических переменных
способ, предложенный mes'ом, конечно, выход из затруднения, но в с++ таким злоупотреблять не стоит

Это сообщение отредактировал(а) Alek86 - 5.5.2008, 09:35


--------------------
user posted image    user posted image
PM MAIL   Вверх
mes
Дата 5.5.2008, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Igor_K @  4.5.2008,  14:22 Найти цитируемый пост)
То есть я в функции main() объявляю некоторые переменные, потом вызываю какуюту функцию и в ней имею доступ к переменным созданным в main(). 

если ты знаешь какие переменные  будут использованы в функции то зачем тебе создавать их динамически??  smile 
Цитата(Igor_K @  4.5.2008,  14:22 Найти цитируемый пост)
. На пхп я бы сделал так:

на php каждый модуль самостоятельный и использует виртуальное (предоставляемое интерпретатором программе в рантайме) глобальное простансво для обмена данных и как следствие этого динамические глобальные переменные .
На С++ есть линкер который собирает программу до ее запуска и проверяет и отводит в программе место для глобальных перемменных
и как результат отсутсвие "реальных" динамических перемеенных.

ИМХО:  Я вижу это различие, как преимущество С++ потому, что он предупредит о всех колизиях переменных, когда как в пхп это ложится на программиста.

Исходя из вышеперечисленного я не могу представить, когда нужны ()действительно полезны) динамические переменные в С++,
- поэтому был бы рад если бы кто нибудь мне привел такой пример (в одной теме я уже пытался выяснить, но так и не добился) 


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


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



Цитата(mes @  5.5.2008,  20:00 Найти цитируемый пост)
когда нужны ()действительно полезны) динамические переменные в С++,

смотря что именно ту понимаешь под "динамическими"
есть такой тип - boost::any - можешь поискать примеры его использования в самом бусте (я видел в program_options) или по форумам


--------------------
user posted image    user posted image
PM MAIL   Вверх
mes
Дата 6.5.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Alek86 @  6.5.2008,  10:16 Найти цитируемый пост)
смотря что именно ту понимаешь под "динамическими"

В данном случае слово "динамическое" не подходит.  Имелось ввиду это :
Цитата(Igor_K @  4.5.2008,  14:35 Найти цитируемый пост)
Мне именно нужно создать определенные переменные в одной функции и потом их юзать в других.  

Сам бы хотел понять что именно хотят получить этим (потому что уже не первый раз спрашивают)  ))
Какой смысл декларировать переменные для одних функций в какой то   другой функции ??  smile 


Цитата(Alek86 @  6.5.2008,  10:16 Найти цитируемый пост)
есть такой тип - boost::any -

Не.. это совсем не то..)) вопрос ставиться не о типе, а о самой переменной









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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



Цитата(mes @  6.5.2008,  11:46 Найти цитируемый пост)
Сам бы хотел понять что именно хотят получить этим 

думаю просто люди привыкли писать в интерпретируемом, где свободы намного больше
потому и удивляются, как в С++ "неудобно"


--------------------
user posted image    user posted image
PM MAIL   Вверх
Igor_K
Дата 6.5.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(mes @  6.5.2008,  11:46 Найти цитируемый пост)
Сам бы хотел понять что именно хотят получить этим (потому что уже не первый раз спрашивают)  ))
Какой смысл декларировать переменные для одних функций в какой то   другой функции ??  smile 

Ну я просто привык в пхп так делать. В пхп если програмить процедурно то имхо без глобальных переменных не обойтись. И в с++ я тоже хочю так сделать, потомучто по другому не мыслю как делать.
PM MAIL   Вверх
Страницы: (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.0746 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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