0

m_MAXとask()はrun()によって使用されますが、それ以外の場合はパブリックにしないでください。これはどのように行うことができますか?

#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();
}
4

4 に答える 4

5

クラスQのプライベートセクション内でm_MAXとask()の両方を定義できます。次に、Qに「friendclassUI」を追加します。これにより、UIはQのプライベートメンバーにアクセスできますが、他のメンバーにはアクセスできません。また、UIは「friendclassUI」ステートメントの前に定義する必要があることに注意してください。前方宣言は機能します。

于 2009-07-15T20:43:52.053 に答える
2

簡単な解決策-m_MAXとask()をプライベートにし、UIをQの友達にします。

于 2009-07-15T20:45:19.600 に答える
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();
}

現在、Q は UI の外では何も見えません。(これはあなたが望むものかもしれませんし、そうでないかもしれません。)

于 2009-07-15T20:59:44.080 に答える
0

最も簡単な解決策はm_MAX、クラスから削除し、 と の両方が定義されている .cpp ファイルの匿名に配置することnamespaceです。これは であるため、クラス宣言の一部として使用しても何も得られません。Q::askUI::runstatic const

于 2009-07-16T06:34:08.917 に答える