web-dev-qa-db-ja.com

ある関数で定義および宣言された変数に別の関数でアクセスするにはどうすればよいですか?

別の関数の関数で宣言および定義された変数にアクセスする方法を誰かに教えてもらえますか?例えば

void function1()
{
   string abc;
}

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

どうやってするか?私はそれを行うことができるパラメーターを使用することを知っていますが、他の方法はありますか?

16
Varun Chitre

C++の方法は、関数を参照してabcを渡すことです。

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

文字列をポインタとして渡し、function2で逆参照することもできます。これは、Cスタイルの方法であり、安全ではありません(たとえば、NULLポインターが渡される可能性があり、適切なエラーチェックを行わないと、未定義の動作やクラッシュが発生します。

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

グローバルにすると、両方が操作できるようになります。

string abc;

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

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

Function1にfunction2で使用する変数がある場合は、次のいずれかを行う必要があります。

  1. 直接渡します
  2. 変数を宣言して渡す両方を呼び出すより高いスコープ関数を持っている、または
  3. それをグローバルに宣言すると、すべての関数がそれにアクセスできます

Function2がfunction1から呼び出された場合は、それを引数としてfunction2に渡すことができます。

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.";   
}   

Function1がfunction2を呼び出さないが、両方ともfunction3によって呼び出される場合、function3に変数を宣言させ、それをfunction1とfunction2の両方に引数として渡します。

void parentFunction( )
{
    std::string abc;  
    function1( abc );  
    function2( abc );  
}
void function1( std::string &passed )   
{   
   // Parent function's 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's variable abc is now aliased as passed and available for general usage.
   cout << passed << " is from parent function.";   
}    

最後に、function1もfunction2も相互に呼び出されず、コード内の同じ関数からも呼び出されない場合は、共有する変数をグローバルとして宣言すると、function1とfunction2はそれを直接使用できます。

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

絶対に方法はありません。ブロックの変数は、そのブロックからのみ直接アクセスできます。

オブジェクトへのポインター/参照は、このブロックからパラメーターとして呼び出される関数に渡すことができます。

2
Kirill Kobelev