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

Forbid users to create objects but allow some classes

本文关键字:许某些 用户 创建对象 禁止      更新时间:2023-10-16

我有以下两个类。

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

函数

push_new_A_into_v();

不会编译,因为 A 的构造函数受到保护。使 B 从 A 继承将无济于事,因为该方法会创建一个全新的 A(为什么受保护的构造函数在此代码中引发错误?

A

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

如何在用户仍无法创建 A 类型的对象时使该方法正常工作?

除了 user2913094 的答案:

如果仅仅为了允许构造而给予B完整的友谊似乎不可接受,您可以添加一个需要构造令牌的构造函数,该令牌只能通过B获得:

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

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

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

class A {
    friend class B;
    ...