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)...)
}