我希望有两个非继承相关和非朋友类,A类和B类。但是,我也希望B类只能由A类实例化,假设B类有私人构造函数。
是否有任何解决方法而无需使用模板?
答案 0 :(得分:2)
不是拥有私人构造函数,而是可以使class B
"私有"不要将它放在任何头文件中。
您可以使用 interface 类来实现此目的。
客户端程序员无法实例化 interface 类,因为它是纯虚拟的,并且无法实例化实现,因为它尚未声明。
实例化它的唯一方法是通过这样的工厂函数:
公共界面:
// classes.h
// pure virtual interface
struct B
{
virtual ~B() {}
virtual void func_1() = 0;
virtual void func_2() = 0;
};
class A
{
public:
// factory method
B* create_B();
};
"私人"实施强>
// classes.cpp
#include "classes.h"
// the *actual* class B
class B_Implementation
: public B
{
public:
void func_1() override
{
// do stuff
}
void func_2() override
{
// do stuff
}
};
B* A::create_B()
{
return new B_Implementation;
}
用法:
int main()
{
A a;
auto b = std::unique_ptr<B>(a.create_B());
}
如果此方法不适合您的情况,则friend
是您唯一的朋友。