禁止用户创建对象但允许某些类

时间:2015-01-09 13:23:43

标签: c++ class inheritance

我有以下两个班级。

Class A
{
   proctected:
      A(){}
};

Class B
{
    push_new_A_into_v();
    vector<A> v;    
};

功能

  

push_new_A_into_v();

由于A&#39的构造函数受到保护,

不会编译。要使B继承自A将无济于事,因为该方法创建了一个全新的A(Why is protected constructor raising an error this this code?)。

A的构造函数受到保护的原因是让用户无法创建A类对象。

如果用户仍然无法创建A类对象,该如何使该方法工作?

2 个答案:

答案 0 :(得分:4)

除了user2913094's answer

如果给予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;
    ...