代码之家  ›  专栏  ›  技术社区  ›  CW Holeman II

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

  •  0
  • CW Holeman II  · 技术社区  · 15 年前

    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 回复  |  直到 13 年前
        1
  •  5
  •   DeusAduro    15 年前

    您可以在类q的私有部分中定义m_max和ask(),然后在q中添加:“friend class ui”。这将允许用户界面访问Q的私有成员,但其他成员都不能访问。还要注意,UI必须在“friend class ui”语句之前定义。远期申报有效。

        2
  •  2
  •   anon    15 年前

    一个简单的解决方案-使m_Max和ask()私有化,并使ui成为q的朋友。

        3
  •  0
  •   Reunanen    15 年前

    是的,将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之外都不可见。(可能是也可能不是你想要的。)

        4
  •  0
  •   Motti    15 年前

    最简单的解决方案是 m_MAX 把它放在一个 anonymous namespace CPP 文件,其中 Q::ask UI::run 定义。因为它是 static const 把它作为类声明的一部分,你什么也得不到。