发布解耦嵌套的C ++类

时间:2013-05-29 20:42:28

标签: c++ class nested

我遇到了一个简单的C ++问题,但我不知道如何解决这个问题。

我有两个类,A和B,无论如何都没有继承。 A是Client类,B是存储Client(A类)列表的类。

我只希望B实例化并销毁B类,但我希望我的代码的其他部分能够调用A类中的方法。

最初,我有以下内容:

class B {
public:
    class A {
        public:
            void setX(int val);
            int getX();
        private:
            int x;
            A();
            ~A();
    };

    B()
    ~B()
    ....
};

这允许我从B调用A的构造函数/析构函数,并使A的构造函数/析构函数从其余部分变为私有,但是在A上调用setX()和getX()变得很麻烦,因为我必须调用B :: A。 / p>

我认为将A放在它自己的文件中(它是自己的类,而不是嵌套的),因为其他类可以在A上调用方法。但是现在B不能访问A的构造函数/析构函数,因为它是私有的。如果我公开,那么任何人都可以创建A类对象。

我不确定最好的方法是什么。如果A是它自己的类,我怎么能保持构造函数/析构函数只对B请用,而其他类可以从A上调用一个对象的setX()和getX()?

2 个答案:

答案 0 :(得分:2)

在自己的非嵌套类中声明A,但是朋友类B应该可以解决问题。

Friend classes

离开你:

class B{
public:
    B()
    ~B()
    ....
};

class A {
    friend class B;
    public:
        void setX(int val);
        int getX();
    private:
        int x;
        A();
        ~A();
};

答案 1 :(得分:0)

我想你可能搞砸了。(或者我在读你的例子时做了!:P)

声明嵌套类使得嵌套类能够访问嵌套类的所有成员,而不是我从解释中理解的反转。
我的意思是:A中的B意味着A访问B的成员,而不是反过来!
Nested Classes Question(Check second response, not first!)

如果在你的问题中说“我只希望B实例化并销毁B类”,那么你的意思是“我只希望B实例化并销毁A类”,那么你有两个选择。

你可以制作B的嵌套类A,让B访问A的私有东西 或者使用朋友班。(查看@Egg回复)