如何/应该隐藏C ++静态成员变量和函数?

时间:2009-07-15 20:41:53

标签: c++ c++11 encapsulation

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 个答案:

答案 0 :(得分:5)

您可以在Q类的私有部分中定义m_MAX和ask()。然后在Q中添加:“friend class UI”。这将允许UI访问Q的私有成员,但没有其他人。另请注意,必须在“friend class UI”语句之前定义UI。前瞻性声明将起作用。

答案 1 :(得分:2)

一个简单的解决方案 - 使m_MAX和ask()私有,并使UI成为Q的朋友。

答案 2 :(得分:0)

是的,宣布用户界面为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可见。 (这可能是你想要的也可能不是。)

答案 3 :(得分:0)

最简单的解决方案是从类中删除m_MAX并将其放在 .cpp 文件中的anonymous namespace中,其中Q::ask和{ {1}}已定义。由于它是UI::run,因此将它作为类声明的一部分,你什么都得不到。