c++ - 如何限制从特定类创建对象

标签 c++ inheritance private-constructor

我有一个“银行”类和一个“分行”类。 “Branch”继承自“Bank”。我只想允许“银行”对象创建新的“分行”对象。 (例如,只有花旗集团可以开设花旗银行的新分行)。

实现这一目标的最佳设计模式是什么?

我目前正在使用带有私有(private)构造函数的友元类。但我不确定这是否是正确的方法。

最佳答案

'Branch' is inherited from 'Bank'

这就是你的问题,你正在使用继承。您正在寻找一种抽象工厂模式,其中 Bank 是分支创建者,并且仅向其各自的创建者提供对分支构造函数的访问。

struct Branch  //abstract
{
    virtual ~Branch() = 0;
};
class CitiBranch : Branch
{
    friend class Citi; //only Citi can create instances of CityBranch
private:
    CitiBranch();
};

struct Bank
{
    virtual ~Bank() = 0;
    virtual Branch* createBranch() = 0;
}

struct Citi : Bank
{
    virtual Branch* creatBranch()
    {
        return new CityBranch;
    }
}

此程序针对的是接口(interface)而不是具体的类。因此,您有 Branch 指针和 Bank 指针,并且实际上不需要知道它们的确切类型。

如果您有一个 Bank* 并调用 createBranch(),您将得到一个 Branch* 返回,但它将指向正确的具体对象。

关于c++ - 如何限制从特定类创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11765454/

相关文章:

c++ - c++17如何获取 "any"存储的数据大小?

python - 在 Python 中使用 "self"访问父方法的问题

C++ 子类的类型是否与它们自己及其父类相同?

java - 带有私有(private)构造函数的最终类,设计原则是什么

C++ 将在类中创建的线程共享同一个类变量吗?

c++ - clang tidy 在循环中提示 push_back into vector

c++ - make_unique 不会为创建单例实例而编译

java - 实例化单例重载构造函数时遇到问题 - 错误 : constructor in type cannot be applied to given types

c++ - 如何获取进程的主线程 ID(通过其 ID 知道)?

html - 停止 CSS 层次结构