2009-07-15 52 views
0

m_MAX和ask()被run()使用,否則不應該公開。如何做到這一點?如何隱藏C++靜態成員變量和函數?

#include <vector> 
class Q { 
public: 
    static int const m_MAX=17; 
    int ask(){return 4;} 
}; 
class UI { 
private: 
    std::vector<Q*> m_list; 
public: 
    void add(Q* a_q){m_list.push_back(a_q);} 
    int run(){return Q::m_MAX==m_list[0]->ask();} 
}; 
int main() 
{ 
    UI ui; 
    ui.add(new Q); 
    ui.add(new Q); 
    int status = ui.run(); 
} 

回答

5

您可以在類Q的專用部分中定義m_MAX和ask()。然後在Q中添加:「friend class UI」。這將允許UI訪問Q的私人成員,但不能訪問其他人。還要注意,UI必須在「friend class UI」語句之前定義。前向聲明將起作用。

+0

將Q改爲:class Q { private: static int const m_MAX = 17; int ask(){return 4;} friend class UI; }; 生成沒有錯誤。你如何注意前向申報? – 2009-07-15 21:10:41

2

一個簡單的解決方案 - 讓m_max的,並要求()私人,使UI Q.

0

沒錯的朋友,聲明UI爲Q的朋友回答你的要求。另一種解決方案可以是使Q成爲UI的私有嵌套級別:

#include <vector> 

class UI { 
private: 
    class Q { 
    public: 
     static int const m_MAX=17; 
     int ask(){return 4;} 
    }; 

    std::vector<Q*> m_list; 

public: 
    void addNewQ(){m_list.push_back(new Q);} 
    int run(){return Q::m_MAX==m_list[0]->ask();} 
}; 

int main() 
{ 
    UI ui; 
    ui.addNewQ(); 
    ui.addNewQ(); 
    int status = ui.run(); 
} 

現在,在UI之外沒有任何Q可見。 (這可能是也可能不是你想要的。)

0

最簡單的解決辦法是從類中刪除m_MAX,並把它放在一個anonymous namespace在這兩個Q::askUI::run定義的的.cpp文件。由於它是static const,因此將它作爲類聲明的一部分而獲得任何東西。