如何将一个 class 的构造函数的调用限制为仅对其工厂 class 的调用?

How do I restrict the calling of the constructor of one class to only its factory class?

除了我的 class 的工厂之外,我想阻止任何东西构建我的 class 类型的对象。我需要 class 有一个 public 接口,但我想将它的创建限制在它的工厂。我该怎么做?

让我们调用 class Car 和工厂 CarFactory。这是我关于如何在不使用 friend 并将所有私有成员公开给工厂的情况下执行此操作的初步想法:

class Car {
private:
  Car();
  Car(Car& ref);

  friend class CarFactory;
};

class CarFactory {
public:
  Car * makeCar();
};

我找到了 Java 的相关问题:How do I make a constructor available to only the factory class?

上面的代码按原样工作。澄清一下,我想知道是否有办法只与工厂共享构造函数而不是所有私有成员?

Car抽象为class,然后在工厂内部实现为私有class:

class Car {
  public:
    virtual void drive()=0;
};
class CarFactory {
  private:
    class CarImp : public Car {
      ...
    };
  public:
    Car *makeCar() { return new CarImp(); }
}

根据您的评论,我假设您正在寻找友元函数。可以找到有关声明好友的帮助 here。这是您修改的示例。

// Forward declare car
class Car;

class CarFactory {
public:
    Car * makeCar();
    Car * makeTruck();
};

class Car {
private:
    Car();
    Car(Car& ref);

    friend Car * CarFactory::makeCar();
};

Car * CarFactory::makeCar() {
    return new Car();
}

Car * CarFactory::makeTruck() {
    return new Car(); // Fails to compile
}

编辑:您在评论中询问了工厂只能使用 Car 的构造函数的解决方案。您将需要定义一个新的实用程序 class,它只能由您想要的方法使用,然后将那个 class 用于您想要保护的每个方法。我个人觉得这种方法很笨拙,但它确实有效。

class Car {

public:
    struct t_private{
    private:
        t_private() = default;
        friend Car * CarFactory::makeCar();
    };

    Car(t_private);

private:
    Car(Car& ref);
};

Car * CarFactory::makeCar() {
    return new Car(Car::t_private{});
}

只有 CarFactory 可以构造 Car 因为没有其他人可以构造 Car::t_private 因为它的构造函数是私有的。 CarFactory 无法访问 Car 的私有成员,因为它不是朋友。