繁体   English   中英

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

[英]How can/should C++ static member variable and function be hidden?

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

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

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

是的,将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。 (可能不是您想要的。)

最简单的解决方案是从类中删除m_MAX ,并将其放在.cpp文件中的匿名namespace中,该文件中同时定义了Q::askUI::run 由于它是static const ,因此将其作为类声明的一部分不会获得任何好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM