我正在编写一个需要创建复杂对象(D)的C ++库,但是向我的库用户返回一个指向简化对象(B)的指针(隐藏复杂对象的许多方法)。我决定通过返回一个指向简化基类(B)的指针,并将我的所有复杂功能添加到派生类(D)来实现它,如下所示:
class B {
virtual void simple() = 0;
}
class D : public B {
void simple() { cout << "visible simple stuff" ; }
void complex() { cout << "invisible complex stuff" ; }
}
在内部我创建了我的对象D,但是我返回一个向上指针,如下所示:
D Derived;
B *Bptr = &Derived;
return Bptr;
这是否是隐藏用户功能的正确方法,同时在库中显示所有其他功能?
隐藏D类的.h文件是阻止我的图书馆用户访问D方法的唯一方法吗? (向下转回D类)我将以开源方式发布库,因此库的用户可以访问D类定义。
答案 0 :(得分:0)
关于问题#1 :是的,如果您提供工厂方法以及简单的&#39;接口:
class B {
public:
static B * create();
virtual void simple() = 0;
};
在B&#39的实施文件中(cpp):
B *B::create()
{
return new D(); //or whatever 'hidden' implementation
}
关于#2 :隐藏功能首先意味着简化,旨在帮助图书馆用户,而不是惩罚性约束。因此,完全隐藏D类,让(好的)用户满意。