如何将一个 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
的私有成员,因为它不是朋友。
除了我的 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
的私有成员,因为它不是朋友。