2017-07-31 18 views
2

プライベート静的変数を持つクラスがあります。メイン関数は変数の値を変更する必要がありますが、メイン関数をクラスのフレンドとして設定しても、変数はprivateでメインからはアクセスできないとコンパイラから通知されます。Cppフレンド関数はプライベート静的メンバーにアクセスできません

例:

ClassA.h:

namespace nameA{  

class ClassA { 
    private: 
     static int varA; 

    public: 
     ClassA(){}; 

    friend int main(void); 
}; 
} 

ClassA.cpp:

namespace nameA{ 

int ClassA::varA = 0; 

} 

メイン:

int main(void){ 
    ClassA::varA = 42; //ERROR 
} 

私がわからない場合は、 "友人"静的メンバーにアクセスすることもできます。別の解決策を見つける。

+0

を動作するはずです。 –

答えて

9

クラスAのfriend関数mainnameA名前空間にあるためです。

あなたがグローバルスコープにあり、あなたはそれをこの方法を行う必要があることを、友人としてint main(void)関数を宣言する場合:(VS2015でコンパイル)

friend int ::main(void); 

全体ソース:

int main(void); 

namespace nameA { 

    class ClassA { 
    private: 
     static int varA; 

    public: 
     ClassA() {}; 

     friend int ::main(void); 
    }; 
} 

namespace nameA { 
    int ClassA::varA = 0; 
} 

int main(void) { 
    nameA::ClassA::varA = 42; 
    return 0; 
} 
2

friend宣言は、グローバルmain関数ではなく、名前空間nameAmainという名前の関数に親密関係を付与します。

あなたのコードは、あなたが名前空間を開始する前にmainを宣言する必要が

namespace nameA 
{ 
    int main(void); 

    class classA 
    { 
     ... 
     friend int main(void); 
    }; 
} 

に相当します。

int main(void); 

namespace nameA 
{  
    class classA 
    { 
     ... 
     friend int main(void); 
    }; 
} 

は、main関数はグローバル名前空間を除き、名前空間で宣言されていない

関連する問題