2016-10-08 8 views
1

以下のプログラムでは、ブロックCのブロックAからaaの値を取得する方法はありますか? スコープ解決演算子を使用して、最も外側のグローバルaaにのみアクセスできます。ネストされたブロックの対象ブロックから変数にアクセスする

既知solutoins:異なるブロック 2.親ブロック内の変数で 1.異なるポインタを現在のブロックの変数

私は、他の代替ソリューションを探していますを使用する前に、

私がいることを知っていますこれは良いコードではありません。それを達成する方法を理解するだけで興味があります。

#include <iostream> 
#include <cstdio> 

using namespace std; 

// Global 
int aa = 10; 

int main() 
{ 
    // Main 
    int aa = 20; 

    { 
     // Block A 
     int aa = 30; 

     { 
      // Block B 
      int aa = 40; 

      { 
       // Block C 
       int aa = 50; 

       cout << "block C " << aa << endl; 
       cout << "block A " << ????? << endl; 
       cout << "global" << ::aa << endl; 
      } 

      cout << "block B " << aa << endl; 
     } 

     cout << "block A " << aa << endl; 
    } 

    cout << "main " << aa << endl; 

    return 0; 
} 

答えて

3

私は、これは良いコードではないことを知っています。それを達成する方法を理解するだけで興味があります。

できません。

変数aaの未定義の使用は、最も近い範囲にあるものを使用します。
変数::aaの装飾された使用は、機能の外のスコープにあるものを使用します。
変数<NS>::aaの装飾された使用は、ネームスペース<NS>の範囲内にあるものを使用します。

0

参考資料を使用してください。もちろん

// Block A 
int aa = 30; 
auto& ref_aa = aa; 
{ 
    // Block B 
    int aa = 40; 

    { 
     // Block C 
     int aa = 50; 

     cout << "block C " << aa << endl; 
     cout << "block A " << ref_aa << endl; 
     cout << "global" << ::aa << endl; 
    } 

    cout << "block B " << aa << endl; 
} 

、それはかなり無意味です。コードを変更できる場合は、変数名を変更するか、必要なブロック数が少なくなるようにリファクタリングします(たとえば、より多くの関数を使用して)。

関連する問題