我有以下两个班级。
Class A
{
proctected:
A(){}
};
Class B
{
push_new_A_into_v();
vector<A> v;
};
功能
由于A&#39的构造函数受到保护,push_new_A_into_v();
不会编译。要使B继承自A将无济于事,因为该方法创建了一个全新的A(Why is protected constructor raising an error this this code?)。
A的构造函数受到保护的原因是让用户无法创建A类对象。
如果用户仍然无法创建A类对象,该如何使该方法工作?
答案 0 :(得分:4)
如果给予B
完全友谊只是为了允许构造似乎是不可接受的,你可以添加一个需要构造标记的构造函数,只能通过B
获得:
class A {
public:
class ConstructionToken {
private:
ConstructionToken();
friend class B;
};
A(ConstructionToken const&);
protected:
A();
};
请注意,令牌类是完全空的,但由于只有B
可以访问其私有构造函数,这实际上阻止了用户直接调用A
的公共构造函数。
这允许更精细的访问控制,但缺点是需要在A
上引入额外的构造函数重载。
答案 1 :(得分:2)
class A {
friend class B;
...