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 中添加:“朋友类 UI”。这将允许 UI 访问 Q 的私有成员,但不能访问其他成员。另请注意,UI 必须在“朋友类 UI”语句之前定义。前向声明将起作用。

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

现在,在 UI 之外看不到 Q 的任何内容。(这可能是也可能不是你想要的。)

于 2009-07-15T20:59:44.080 回答
0

最简单的解决方案是m_MAX从类中删除并将其放在 .cpp 文件中的匿名文件中,其中定义namespace了和。由于它是类声明的一部分,因此您一无所获。Q::askUI::runstatic const

于 2009-07-16T06:34:08.917 回答