在运行时使用不同的构造函数

时间:2014-02-18 11:52:18

标签: c++ constructor const

我班上有2个构造函数:

Class()
Class(const std::string &fileName)

我不希望我的fileName在构造函数的其他地方设置。 但构造函数调用依赖于运行时:

int main(int ac, char**av)
{
  if (ac > 1)
    Class test(av[1])
  else
    Class test;
  return (0);
}

此表示法未编译导致“类未在范围中定义”

另一种解决方案是使用类指针:

int main(int ac, char **av)
{
  Class  *test;

  if (ac > 1)
    test = new Class(av[1]);
  else
    test = new Class();
  /* Do stuff ...*/
  delete test;
  return (0);
}

但我不想使用新的。 还有其他方法吗?

提前致谢:)

3 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

Class make_class(int ac, char**av)
{
    if (ac > 1) {
        return Class(av[1]);
    } else {
        return Class();
    }
}


int main(int ac, char**av)
{
    Class test = make_class(ac, av);
    return (0);
}

答案 1 :(得分:2)

如果Jarod的答案不是一个选项(因为你不能使类可复制而且你没有使用C ++ 11),这里有一些其他的选择:

  • new分配并存储在boost::scoped_ptrstd::unique_ptr中。 (shared_ptr过度杀伤。)
  • 使用boost::optional并插入其中。

答案 2 :(得分:1)

虽然Jarod42的答案很好,但你也可以在没有功能的情况下做到这一点:

Class test = (ac > 1) ? Class(av[1]) : Class();

当然,味道问题更好。对于复杂的情况,功能是可行的方法。