我想防止除类的工厂之外的任何东西构造类类型的对象。我需要该类具有一个公共接口,但我想将其创建仅限于其工厂。我怎么做?
让我们称之为班级Car
和工厂CarFactory
。这是我在不使用friend
所有私有成员并将其暴露给工厂的情况下如何执行此操作的最初想法:
class Car { private: Car(); Car(Car& ref); friend class CarFactory; }; class CarFactory { public: Car * makeCar(); };
我发现了一个与Java有关的问题:如何使构造函数仅对工厂类可用?
上面的代码按原样工作。澄清一下,我想知道是否有一种方法可以只与工厂共享构造函数,而不能与所有私有成员共享?
根据您的评论,我认为您正在寻找一个朋友功能。声明朋友的帮助可以在这里找到。这是您修改的示例。
// 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 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
。