2017-07-31 93 views
2

我有一個私有靜態變量的類。主函數應該改變變量的值,但即使我將主函數設置爲類的朋友,編譯器告訴我該變量是私有的,並且不能從main訪問。Cpp Friend功能無法訪問私有靜態成員

例子:

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

這是因爲ClassA中的朋友函數main位於nameA名稱空間中。

如果你想聲明作爲朋友int main(void)功能,即位於全球範圍內,你應該這樣來做:

friend int ::main(void); 

整個源代碼(在VS2015編譯):

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聲明會在名稱空間nameA中爲名爲main的函數授予友誼,而不是全局main函數。

您的代碼就相當於

namespace nameA 
{ 
    int main(void); 

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

您需要聲明main命名空間開始之前。

int main(void); 

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

應該工作