如何在初始化列表中使用条件

时间:2015-09-21 18:57:24

标签: c++

我有一个派生自父类的子类。我需要使用条件逻辑来确定要传递给父类构造函数的参数。我这样做如下:

Child::Child(const std::string & foo)
        :Parent(foo=="x"?someClassPtr(new someClass()):someClassPtr(new someOtherClass()))
{
}

但是如果我想为foo ==“y”和foo ==“z”传递一个不同的参数呢?有没有办法在不使用三元运算符的情况下执行此操作?

1 个答案:

答案 0 :(得分:4)

尽管您可以使用嵌套条件表达式来完成它,但我建议不要这样做:即使只有一个条件表达式,表达式也不可读,更不用说两个或三个嵌套条件。

使用私有静态成员函数对于此任务来说是一个不错的选择:该函数可以解析" foo的值,并决定要返回的正确对象:

Child::Child(const std::string & foo)
:   Parent(constructParentArgs(foo)) {
}
private static someClassPtr *constructParentArgs(const std::string& foo) {
    if (foo == "x") return someClassPtr(new someClass());
    if (foo == "y") return someClassPtr(new someOtherClass());
    if (foo == "z") return someSubClassPtr(new yetAnotherClass());
    // provide a default value here
    return someClassPtr(new defaultClass());
}

这种方法对于代码的读者的好处是,他们不必为调用父构造函数的细节而烦恼,除非他们想看看发生了什么。当他们读取标题时,他们都知道你的代码以某种方式创建了父参数。如果他们想要了解参数的构造方式,他们总是可以直接进入私有成员函数。