当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将一个类的构造函数的调用限制为仅其工厂类?》经验,为你挑选了1个好方法。

我想防止除类的工厂之外的任何东西构造类类型的对象。我需要该类具有一个公共接口,但我想将其创建仅限于其工厂。我怎么做?

让我们称之为班级Car和工厂CarFactory。这是我在不使用friend所有私有成员并将其暴露给工厂的情况下如何执行此操作的最初想法:

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

  friend class CarFactory;
};

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

我发现了一个与Java有关的问题:如何使构造函数仅对工厂类可用?

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



1> François And..:

根据您的评论,我认为您正在寻找一个朋友功能。声明朋友的帮助可以在这里找到。这是您修改的示例。

// 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

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有