Модераторы: 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   Вверх
xvr
Дата 6.5.2008, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

Была такая машина - 'Эльбрус 2', и был у нее язык програмирования 'Эль 76', весь насквозь динамический, при описании переменной указывался только ее размер, содержимое же переменной (целое, плавающее или указатель) определялось динамически на этапе выполнения (прямо boost::any). Казалось бы очень удобно, очень гибко и динамично, гип-гип ура! Увы, эта гибкость обернулось ОГРОМНЫМ недостатком - если компилятор C/C++ способен найти несоотвествие типов уже на этапе компиляции (причем все), то на Эльбрусе эти несоотвествия вываливались run-time (причем по мере хождения по этим граблям). И не было никакой гарантии, что не осталось каких нибудь несоотвествий типов (просто потому, что по этому месту не прошли). Явная динамика типов была нужна КРАЙНЕ редко. В следующей версии Эль 76 были добавлены статические описания типов.
PM MAIL   Вверх
mes
Дата 6.5.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Igor_K @  6.5.2008,  12:02 Найти цитируемый пост)
В пхп если програмить процедурно то имхо без глобальных переменных не обойтись. И в с++ я тоже хочю так сделать 

ну  если нужны глобальные переменные , в cpp ничего не мешает их использовать.. также как и процедурный стиль
Код

// в одном .cpp файле 
extern int glob_var1;
void funct1 ()
{
   glob_var1 +=10;
};

// в другом .cpp файле
int glob_var1;  
void funct1();

void funct ()
{
  glob_var1 = 5;
  func1 ();
 std::cout<<glob_var1;
};

В примере обшая переменная для двух функций храняшихся в разных файлах . Единственное отличие oт примера на php - декларация вне фунциии;
Вот и вопрос чем не устраивает такой подход и почему надо обязательно иметь возможность декларировать глобальные переменные в фунции ??

Цитата(Igor_K @  6.5.2008,  12:02 Найти цитируемый пост)
потому что по другому не мыслю как делать. 

Тогда тебе придется рисовать круги от руки как карандашом, несмотря на то что ты держишь циркуль ))

Цитата(Alek86 @  6.5.2008,  11:58 Найти цитируемый пост)
думаю просто люди привыкли писать в интерпретируемом, где свободы намного больше
потому и удивляются, как в С++ "неудобно" 

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

Добавлено через 6 минут и 55 секунд
Цитата(xvr @  6.5.2008,  12:11 Найти цитируемый пост)
 не было никакой гарантии, что не осталось каких нибудь несоотвествий типов (просто потому, что по этому месту не прошли

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


Это сообщение отредактировал(а) mes - 6.5.2008, 16:27


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


Эксперт
***


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

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



Цитата(mes @  6.5.2008,  16:24 Найти цитируемый пост)
Вот и вопрос чем не устраивает такой подход и почему надо обязательно иметь возможность декларировать глобальные переменные в фунции ??

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


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


Эксперт
****


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

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



Цитата(Alek86 @  6.5.2008,  16:42 Найти цитируемый пост)
возможно потому, что глобальная переменная должна быть видна только в 2х функциях и ни в каких других 

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

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

Добавлено через 3 минуты и 26 секунд
хотя это, конечно, для того случая, если есть причины не создавать класс, в котором будут эти функции (т.к. налицо нечто общее между ними)


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


Шустрый
*


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

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



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

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;) и к ней есть доступ.


На C/C++ это лучше сделать и вовсе без глобальных переменных:
Код

void funct(const bool & flag) // если нужна возможность влиять на внешний flag, то убираем const
{
  if(flag) std::cout << "Hello!";
}

void myfunct()
{
  bool flag = true;
  funct(flag);
}


Цитата(Igor_K @  6.5.2008,  12:02 Найти цитируемый пост)
 И в с++ я тоже хочю так сделать, потомучто по другому не мыслю как делать

Цитата(Igor_K @  4.5.2008,  14:35 Найти цитируемый пост)
Такой подход я знаю. Но мне он не подходит.

Приведи конкретный пример.

Цитата(Alek86 @  6.5.2008,  16:42 Найти цитируемый пост)
возможно потому, что глобальная переменная должна быть видна только в 2х функциях и ни в каких других

namespace?
PM MAIL ICQ   Вверх
Любитель
Дата 7.5.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Что-т в последнее время много тем, по сути сводящиеся к вопросу: "почему С++ не позволяет делать то, что делается в скриптовых языках...".


--------------------
PM MAIL ICQ Skype   Вверх
Lazin
Дата 7.5.2008, 16:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Любитель @  7.5.2008,  16:24 Найти цитируемый пост)
Что-т в последнее время много тем, по сути сводящиеся к вопросу: "почему С++ не позволяет делать то, что делается в скриптовых языках...". 

 smile весна smile 
PM MAIL Skype GTalk   Вверх
Alek86
Дата 7.5.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(opjox @  6.5.2008,  22:45 Найти цитируемый пост)
namespace?

неймспейс хорошо, а класс - лучше, ибо переменную можно приватной сделать и все - никакой using namespace ничего плохого не сделает


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


Бывалый
*


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

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



Ага. тупая моя башка  smile  Я понял что в С++ если изменить переданные функции параметры, то изменятся их значения и в вызывающей функции. В пхп просто такого нету. Того и нужно прописывать их как глобальные.

Про ООП в С++ я ваще ничего не шарю, еще не дорос. Так что ничего написать не могу. smile

Добавлено через 4 минуты и 18 секунд
И еще мне не понравилось в С++ что функция не может массив возвращать :(

Это сообщение отредактировал(а) Igor_K - 7.5.2008, 22:49
PM MAIL   Вверх
bsa
Дата 7.5.2008, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Igor_K @ 7.5.2008,  22:48)
Я понял что в С++ если изменить переданные функции параметры, то изменятся их значения и в вызывающей функции. В пхп просто такого нету. Того и нужно прописывать их как глобальные.

Ты не понял. На самом деле все зависит от способа передачи параметров. Можно передать так, что в вызывающей ничего не изменится (по значению), а можно и так, что изменится (по ссылке или по указателю):
Код
#include <iostream>

void func1(int n) //по значению
{
   std::cout << "n = " << n;
   ++n;
   std::cout << "\nn = " << n << std::endl;
}
void func2(int &n) //по ссылке
{
   std::cout << "n = " << n;
   ++n;
   std::cout << "\nn = " << n << std::endl;
}
void func3(int *n) //по указателю
{
   std::cout << "n = " << *n;
   ++*n;
   std::cout << "\nn = " << *n << std::endl;
}

int main()
{
   int n = 0;
   func1(n);
   //n == 0
   func2(n);
   //n == 1
   func3(&n);
   std::cout << "n = " << n << std::endl; //выведется n = 2
   return 0;
}

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


Эксперт
***


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

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



И еще мне не понравилось в С++ что функция не может массив возвращать :(
в C++ это и не нужно.
PM MAIL   Вверх
opjox
Дата 7.5.2008, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Alek86 @  7.5.2008,  17:04 Найти цитируемый пост)
неймспейс хорошо, а класс - лучше

Так я про способ скрытия глобальных переменных, не переводя их в другую категорию.
А так, согласен, класс лучше, но все же не всегда – создавать экземпляр класса для вызова всего одной функции, для которой нужно укрыть переменные, на мой взгляд, не слишком хорошо. 

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

Цитата(Alek86 @  7.5.2008,  17:04 Найти цитируемый пост)
никакой using namespace ничего плохого не сделает

Неименованному пространству имен никакой using не сделаешь smile 

Цитата(Igor_K @  7.5.2008,  22:48 Найти цитируемый пост)
Я понял что в С++ если изменить переданные функции параметры, то изменятся их значения и в вызывающей функции.

Это смотря как передашь. 

Цитата(Igor_K @  7.5.2008,  22:48 Найти цитируемый пост)
И еще мне не понравилось в С++ что функция не может массив возвращать :(

Код

#include <vector>

char * v1()
{
  char * p = new char[20];
  // какие-то действия c p
  return p;
}

void v2(char *& p)
{
  p = new char[20];
  // какие-то действия c p 
}

void v3(char * p)
{
  // какие-то действия c p
}

void v4(std::vector<char> & v)
{
  // какие-то действия c v
}

/*
писать что-то типа
std::vector<char> v5()
{
  std::vector<char> v;
  // какие-то действия c v
  return v;
}
не стоит, т.к. при выходе будет происходить копирование (т.к. 
внутренний вектор v при выходе из области видимости должен быть уничтожен),
что может быть весьма затратно
*/

int main()
{
  char * p;
  
  p = v1();
  // какние-то действия с p
  delete [] p;

  v2(p);
  // какние-то действия с p
  delete [] p;

  p = new char[20];
  v3(p);
  // какние-то действия с p
  delete [] p;

  std::vector<char> v;
  v4(v);
  // какние-то действия с v
  // при выходе из области видимости v будет самостоятельно уничтожен

  return 0;
}

/*
варианты v1 и v2 не самые лучшие
куда лучше выделять и освобождать память в одной и тойже функции
*/


Это сообщение отредактировал(а) opjox - 9.5.2008, 00:34
PM MAIL ICQ   Вверх
Любитель
Дата 8.5.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(opjox @  7.5.2008,  23:35 Найти цитируемый пост)
/*
писать что-то типа
std::vector<char> v5()
{
  std::vector<char> v;
  // какие-то действия c v
  return v;
}
не стоит, т.к. при выходе будет происходить копирование (т.к. 
внутренний вектор v при выходе из области видимости должен быть уничтожен),
что может быть весьма затратно
*/

Для QList (и прочие кутешные классы) вполне нормально возвращать коллекцию. Копируется только внутренний указатель (при изменении, если несколько физических объектов владеют этим указателем - делается копия коллекции).


--------------------
PM MAIL ICQ Skype   Вверх
mes
Дата 8.5.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Любитель @  8.5.2008,  12:28 Найти цитируемый пост)
QList (и прочие кутешные классы) 

Примечание: это относится  только к объектам реализованным в стиле COW (copy_on_write) 
 



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


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


Эксперт
***


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

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



Цитата(opjox @  7.5.2008,  23:35 Найти цитируемый пост)
создавать экземпляр класса для вызова всего одной функции

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


Цитата(opjox @  7.5.2008,  23:35 Найти цитируемый пост)
Неименованному пространству имен никакой using не сделаешь 

ага
оно включено во всей cpp-шке и так - то есть ВСЕ функции могут попортить переменную


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


Эксперт
****


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

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



Цитата(opjox @  7.5.2008,  23:35 Найти цитируемый пост)
void v2(char * p)
{
  p = new char[20];
  // какие-то действия c p 
}

вот этоочень нехорошо: адрес, записанный в p=new... будет потерян при выходе из функции
нужно передавать p по ссылке


--------------------
qqq
PM WWW   Вверх
opjox
Дата 9.5.2008, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вижу, голова вчера не варила как надо.

Цитата(Alek86 @  8.5.2008,  12:40 Найти цитируемый пост)
static

Вчера забыл про него совершенно. 
Цитата(maxim1000 @  8.5.2008,  20:19 Найти цитируемый пост)
вот этоочень нехорошо: адрес, записанный в p=new... будет потерян при выходе из функциинужно передавать p по ссылке

Недожал «&», просмотрел.
Благодарю, что указали на ошибку, сейчас исправлю.

--------------------------------------------------

Цитата(Alek86 @  8.5.2008,  12:40 Найти цитируемый пост)
а вообще надо смотреть по ситуации

Солидарен 
Цитата(Alek86 @  8.5.2008,  12:40 Найти цитируемый пост)
оно включено во всей cpp-шке и так - то есть ВСЕ функции могут попортить переменную

Ну так и выделяем эти функции в отдельный файл


PM MAIL ICQ   Вверх
Страницы: (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.0931 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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