我班上有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);
}
但我不想使用新的。 还有其他方法吗?
提前致谢:)
答案 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_ptr
或std::unique_ptr
中。 (shared_ptr
过度杀伤。)boost::optional
并插入其中。答案 2 :(得分:1)
虽然Jarod42的答案很好,但你也可以在没有功能的情况下做到这一点:
Class test = (ac > 1) ? Class(av[1]) : Class();
当然,味道问题更好。对于复杂的情况,功能是可行的方法。