封装子类

时间:2014-12-12 10:48:34

标签: c++

我有一堆类Bar1Bar2等,它们共享一个共同的父类Foo。我想完全隐藏它们,只能通过Foo的虚拟方法提供的界面访问它们。我试图将它们嵌套为Foo的私有类,如下所示:

class Foo
{
    public:
        Foo ();
        static Foo *MakeBar (int someParams);

    private:
        class Bar1 : public Foo
        {
            Bar1 () : Foo () {}
        };

        class Bar2 : public Foo
        {
            Bar2 () : Foo () {}
        };

        // etc
};

但是,这是不可能的,因为类Foo在声明时间Bar1时是不完整的。是否有其他方法可以阻止直接访问子类?

2 个答案:

答案 0 :(得分:5)

尝试将继承的类从类声明移动到实现单元中的未命名的命名空间。像这样:

foo.h中

class Foo
{
public:
    Foo ();
    static Foo *MakeBar (int someParams);
};

Foo.cpp中

#include "foo.h"

namespace {

class Bar1 : public Foo
{
      Bar1 () : Foo () {}
};

class Bar2 : public Foo
{
      Bar2 () : Foo () {}
};

} // endof unnamed namespace

Foo *Foo::MakeBar (int someParams)
{
    // do stuff here
}

答案 1 :(得分:0)

你可以通过拆分类的声明来完成你想要的(使Bar类对Foo变为私有):

class Foo
{
public:
    Foo ();
    static Foo *MakeBar (int someParams);

private:
    class Bar1;
    class Bar2;

    // etc
};

class Foo::Bar1 : public Foo
{
    Bar1 () : Foo () {}
};

class Foo::Bar2 : public Foo
{
    Bar2 () : Foo () {}
};