2009-07-15 4 views
0

m_MAXとask()はrun()によって使用されますが、そうでない場合はpublicでなければなりません。これはどのようにして/行うべきですか?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は「友人クラスUI」ステートメントの前に定義する必要があります。フォワード宣言が有効です。

+0

Qを次のように変更します。クラスQ { プライベート: static int const m_MAX = 17; int ask(){return 4;} フレンドクラスのUI。 }; エラーは発生しません。フォワード宣言についてはどのように注意しますか? –

+0

多分私は間違っていたかもしれませんが、私はあなたが未知のシンボルエラーを取得すると仮定しました。しかし、友人の声明は、前方宣言のように機能するかもしれません。しかし、それは動作します。 – DeusAduro

2

シンプルなソリューション - M_MAXを作成して(聞いて)民間とUI Q.

の友人
0

うん作る、Qの友人としてUIを宣言すると、あなたが求めるものに答えています。別の解決方法は、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を削除し、Q::askUI::runの両方が定義されているた.cppファイルにanonymous namespaceにそれを置くことであろう。 static constなので、クラス宣言の一部としてそれを持つことで何も得られません。

関連する問題