Как получить доступ к переменным, определенным и объявленным в одной функции в другой функции?

Может ли кто-нибудь сказать мне, как обращаться к переменным, объявленным и определенным в функции в другой функции. Например

void function1()
{
   string abc;
}

void function2()
{
   I want to access abc here.
}

Как это сделать? Я знаю, используя параметры, которые мы можем сделать, но есть ли другой способ?

Ответ 1

Путь С++ состоит в передаче abc по ссылке на вашу функцию:

void function1()
{
    std::string abc;
    function2(abc);
}
void function2(std::string &passed)
{
    passed = "new string";
}

Вы также можете передать свою строку в качестве указателя и разыменовать ее в функции2. Это больше похоже на C-стиль, и он не так безопасен (например, может быть передан указатель NULL, и без хорошей проверки ошибок это приведет к поведению или сбоям undefined.

void function1()
{
    std::string abc;
    function2(&abc);
}
void function2(std::string *passed)
{
    *passed = "new string";
}

Ответ 2

Сделайте это глобальным, и оба могут манипулировать им.

string abc;

void function1(){
    abc = "blah";
} 

void function2(){
    abc = "hello";
} 

Ответ 3

Если у вас есть переменная в функции1, которую вы хотите использовать в функции2, то вы должны либо:

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

Если ваша функция2 вызывается из функции 1, вы можете просто передать ее как аргумент функции2.

void function1()  
{  
    std::string abc;  
    function2( abc );  
}  

void function2( std::string &passed )   
{   
    // function1::abc is now aliased as passed and available for general usage.
   cout << passed << " is from function1.";   
}   

Если функция 1 не вызывает функцию2, но оба вызываются функцией3, тогда функция 3 объявляет переменную и передает ее как функции1, так и функции2 в качестве аргумента.

void parentFunction( )
{
    std::string abc;  
    function1( abc );  
    function2( abc );  
}
void function1( std::string &passed )   
{   
   // Parent function variable abc is now aliased as passed and available for general usage.
   cout << passed << " is from parent function.";   
}   
void function2( std::string &passed )   
{   
    // Parent function variable abc is now aliased as passed and available for general usage.
   cout << passed << " is from parent function.";   
}    

Наконец, если ни функция function1, ни функция2 не вызываются друг от друга, ни одна и та же функция в коде, тогда объявляйте переменную, которая будет использоваться как глобальная, и функция function1 и function2 смогут напрямую ее использовать.

std::string global_abc;  
void function1( )   
{   
   cout << global_abc << " is available everywhere.";   
}   
void function2( )   
{   
   cout << global_abc << " is available everywhere.";   
}    

Ответ 4

Нет абсолютно никакого способа. Переменные блока могут быть напрямую доступны ТОЛЬКО из этого блока.

Указатели/ссылки на объект могут передаваться в функции, вызываемые из этого блока в качестве параметров.