禁止用户创建对象但允许某些类
Forbid users to create objects but allow some classes
我有以下两个类。
Class A
{
proctected:
A(){}
};
Class B
{
push_new_A_into_v();
vector<A> v;
};
函数
push_new_A_into_v();
将无法编译,因为 A 的构造函数受到保护。使 B 从 A 继承无济于事,因为该方法创建了一个全新的 A(Why is protected constructor raising an error this this code?)。
之所以保护A的构造函数是为了让用户无法创建A类型的对象。
当用户仍然无法创建类型 A 的对象时,如何使该方法起作用?
class A {
friend class B;
...
除了:
如果给予B
完全友谊只是为了允许建造似乎不可接受,你可以添加一个需要建造令牌的构造器,它只能通过B
:
获得
class A {
public:
class ConstructionToken {
private:
ConstructionToken();
friend class B;
};
A(ConstructionToken const&);
protected:
A();
};
请注意,令牌 class 完全是空的,但由于只有 B
可以访问其私有构造函数,这实际上阻止了用户调用 A
的 public 直接构造函数。
这允许更细粒度的访问控制,但缺点是需要在 A
上引入额外的构造函数重载。
我有以下两个类。
Class A
{
proctected:
A(){}
};
Class B
{
push_new_A_into_v();
vector<A> v;
};
函数
push_new_A_into_v();
将无法编译,因为 A 的构造函数受到保护。使 B 从 A 继承无济于事,因为该方法创建了一个全新的 A(Why is protected constructor raising an error this this code?)。
之所以保护A的构造函数是为了让用户无法创建A类型的对象。
当用户仍然无法创建类型 A 的对象时,如何使该方法起作用?
class A {
friend class B;
...
除了
如果给予B
完全友谊只是为了允许建造似乎不可接受,你可以添加一个需要建造令牌的构造器,它只能通过B
:
class A {
public:
class ConstructionToken {
private:
ConstructionToken();
friend class B;
};
A(ConstructionToken const&);
protected:
A();
};
请注意,令牌 class 完全是空的,但由于只有 B
可以访问其私有构造函数,这实际上阻止了用户调用 A
的 public 直接构造函数。
这允许更细粒度的访问控制,但缺点是需要在 A
上引入额外的构造函数重载。