我有以下两节课。

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型对象时,如何使该方法起作用?

最佳答案

除了user2913094's answer

如果给予B完全友情只是为了允许构造似乎是不可接受的,则可以添加一个需要构造令牌的构造函数,该构造令牌只能由B获得:

class A {
public:
    class ConstructionToken {
    private:
        ConstructionToken();
        friend class B;
    };

    A(ConstructionToken const&);
protected:
    A();
};


请注意,令牌类完全为空,但是由于只有B可以访问其私有构造函数,因此从根本上阻止了用户直接调用A的公共构造函数。

这允许进行更细粒度的访问控制,但缺点是需要在A上引入附加的构造函数重载。

07-24 09:51
查看更多