【问题标题】:Use different constructors at runtime在运行时使用不同的构造函数
【发布时间】:2014-02-18 11:52:17
【问题描述】:

我的班级有 2 个构造函数:

Class()
Class(const std::string &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);
}

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

提前致谢:)

【问题讨论】:

  • 当您想要默认初始化而不是选项时是否传递一个空字符串?
  • 使用第二种解决方案有什么问题。如果您将其存储在std::shared_ptr 中,您会没事的
  • 我无法复制您的错误。你的第一个代码示例works fine 给我。你如何定义你的班级?
  • @user2079303 是的,这行得通,但是你不能在if 语句之后使用test,因为你实际上有两个不同的变量,都命名为test,每个变量都有一个范围仅限于if 的一个分支。

标签: c++ constructor constants


【解决方案1】:

你可以这样做:

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

【讨论】:

  • 在这种情况下不要忘记使类可复制和/或移动。
【解决方案2】:

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

  • 使用new 分配并存储在boost::scoped_ptrstd::unique_ptr 中。 (shared_ptr 太过分了。)
  • 使用boost::optional 并置入其中。

【讨论】:

    【解决方案3】:

    虽然 Jarod42 的回答很好,但您也可以在没有函数的情况下这样做:

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

    哪个更好当然是口味问题。对于复杂的情况,函数是要走的路。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多