2012-08-02 24 views
10

他の関数の関数で宣言し定義した変数にアクセスする方法を教えてもらえますか?例:別の関数のある関数で定義され、宣言された変数にアクセスする方法は?

void function1() 
{ 
    string abc; 
} 

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

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

+3

私はあなたがスコープで読んで、それがなぜ不可能であるかを理解することをお勧めします。 –

+0

これは意味がありません: 'function1'の呼び出しごとに' abc'のインスタンスが1つあります。 'for(int i = 0; i <100; ++ i){function1(); } '' abc'の百インスタンスのうちどれを望みますか? –

+0

静的メンバーについて知っていますか? – phadaphunk

答えて

12

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

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

あなたはまた、機能2にポインタとして、それを逆参照あなたの文字列を渡すことができます。これは、物事のCスタイルの方法よりであり、以下のように安全ではありません(たとえば、NULLポインタが渡された、との良好なエラーなしで、それは未定義の動作やクラッシュの原因となりますチェックすることができます。

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

ありがとうございます私はあなたに知らせることを試みます:D –

+0

これは働いた! :D ありがとうございました! –

1

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

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

+1

これは、もちろん、偽です。スコープは、オブジェクトの名前が別のブロックに表示されないように制限します。オブジェクトへのアクセスは制限されません。他の手段の中でも、参照を渡すことでアクセスできます。 –

+0

@EricPostpischilしかし何に言及していますか?スコーピングは、静的または動的に割り当てられていない限り、オブジェクトの有効期間も定義します。さらにOPは "no parameters"を指定しました。 – juanchopanza

+0

参照をグローバル変数に入れます。参照を他の関数に渡します。参照を他の関数にアクセス可能にする関数に渡します。パラメータとしてポインタをとり、指し示された場所に参照を格納します。等 –

6

にそれがグローバル作り、その後両方は、それを操作することができます

string abc; 

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

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

私はこれを提案しようとしていましたが、OPは具体的には、 '関数で宣言され定義された変数'と述べています。 – JoeFish

+1

可変スコープに精通していない場合、彼はこの方法が可能であるかどうかを知らなかった可能性があります。 – BenN

+0

ありがとう!試してみます –

5

あなたが機能2で使用する関数1で変数を持っている場合、あなたはどちらかでなければなりません:。

  1. パス、それを直接、
  2. を10
  3. あなたの機能2は関数1から呼び出された場合、それは、すべての機能が、その後することができます、

それをグローバルとアクセスすることができます両方 は変数を宣言して、それを渡す呼び出して高いスコープ機能を持っている、または

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

    関数1は、変数を宣言し、引数として関数1と機能2の両方に渡し関数3持って、その後、機能2を呼び出すことはありませんが、両方が関数3によって呼び出された場合。どちらはfunction1も機能2が互いに呼び出された場合

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

    最後に、またコードに同一の機能から、グローバルとして共有される変数を宣言し、機能1と機能2は、直接使用することができるであろう。

    std::string global_abc; 
    void function1() 
    { 
        cout << global_abc << " is available everywhere."; 
    } 
    void function2() 
    { 
        cout << global_abc << " is available everywhere."; 
    }  
    
  • 関連する問題