C++ C++;具有私有初始化的构造函数

C++ C++;具有私有初始化的构造函数,c++,c++11,constructor,factory,C++,C++11,Constructor,Factory,不确定以前是否有人问过这个问题。我正在实现一个工厂类。每个实例都应该从基类InstBase继承,并且应该通过一个集中的工厂进行初始化 class InstBase { friend class Factory; private: InstBase() = default; factory* factory; } class Factory { template <typename Derived, typename... ArgsT>

不确定以前是否有人问过这个问题。我正在实现一个工厂类。每个实例都应该从基类
InstBase
继承,并且应该通过一个集中的工厂进行初始化

class InstBase {
  friend class Factory;      

  private:
    InstBase() = default;
    factory* factory;
}


class Factory {

   template <typename Derived, typename... ArgsT>
   InstBase* get(ArgsT&&... args) {
     return new Derived(std::forward<ArgsT>(args)...)                     
   }

}

class MyInst : public InstBase {
   public:
   MyInst(int a, int b) {...};
}

factory.get<MyInst>(1, 2);

我觉得这有点多余,因为基类
InstBase
总是在派生类之前创建,并且只能由工厂类更新。在不更改
get
的界面的情况下,是否有任何技巧可以实现此目标?对于我来说,要求用户在参数列表中附加另一个指向
factory
的指针(例如,
factory.get(1,2,&factory)
)是没有意义的。

如果您想禁止使用
factory
作为参数的类型,您可以使用类似的东西(符合C++11):

模板
constexpr bool isBaseOf(){return false;}
模板
constexpr bool isBaseOf(){return std::is_base_of::value | | isBaseOf()}
因此,将工厂方法更改如下:

template <typename Derived, typename... ArgsT>
InstBase* get(ArgsT&&... args) {
    static_assert(not isBaseOf<Factory, ArgsT...>(), "!");
    return new Derived(std::forward<ArgsT>(args)...)                     
}
模板
InstBase*get(ArgsT&…args){
静态断言(不是isBaseOf(),“!”);
返回新的派生(std::forward(args)…)
}

也就是说,我不太喜欢它,因为我不会使用不允许我使用所需参数的类

如果您想禁止使用
工厂
作为参数的类型,您可以使用类似以下内容(符合C++11):

模板
constexpr bool isBaseOf(){return false;}
模板
constexpr bool isBaseOf(){return std::is_base_of::value | | isBaseOf()}
因此,将工厂方法更改如下:

template <typename Derived, typename... ArgsT>
InstBase* get(ArgsT&&... args) {
    static_assert(not isBaseOf<Factory, ArgsT...>(), "!");
    return new Derived(std::forward<ArgsT>(args)...)                     
}
模板
InstBase*get(ArgsT&…args){
静态断言(不是isBaseOf(),“!”);
返回新的派生(std::forward(args)…)
}

也就是说,我不太喜欢它,因为我不会使用不允许我使用所需参数的类

您的示例代码:
ptr->factor=this
看起来不错,你不需要
中的
来让它工作。请看这里:
有什么技巧可以在不改变get的界面的情况下实现这个目标吗?
你的目标是什么?java C++中的Java,而不是用C++编写java,你的建议不会改变它的接口。拥有公共继承、私有构造函数、原始拥有指针和集中工厂都是C++中的可怕事情。示例代码:<代码> PTR>因子=此;code>看起来不错,你不需要
中的
来让它工作。请看这里:
有什么技巧可以在不改变get的界面的情况下实现这个目标吗?
你的目标是什么?java C++中的Java,而不是用C++编写java,你的建议不会改变它的接口。拥有公共继承,私有的构造函数,原始拥有的指针和集中的工厂都是C++中的可怕的东西。
template <typename Derived, typename... ArgsT>
InstBase* get(ArgsT&&... args) {
    static_assert(not isBaseOf<Factory, ArgsT...>(), "!");
    return new Derived(std::forward<ArgsT>(args)...)                     
}