我需要用户在 main() 中输入两个 bool 值,然后将其作为参数输入到单独文件中的类函数中。但是,如果没有输入布尔值,我也希望用户调用类中的默认构造函数。我怎样才能做到这一点?
问问题
138 次
3 回答
1
实现一个采用默认参数的构造函数。例如
TestClass(bool bVal1 = false, bool bVal2 = false);
您根据需要更改以实现所需的默认行为,然后如果您创建这样的实例
TestClass test_instance; // constructor uses default args
TestClass test_instance2(true,false); // constructor uses specified args
那么构造函数会将参数视为构造函数声明中设置的默认值(如果没有提供)。
或者有2个构造函数
TestClass();
TestClass(bool bVal1, bool bVal2);
并让类的用户使用合适的。
于 2012-07-08T23:08:35.850 回答
1
考虑以下情况:
struct Test {
bool val1, val2;
Test(bool val1, bool val2) : val1(val1), val2(val2) { }
};
最干净的解决方案看起来有点像这样:
int main() {
bool val1 = true, val2 = true;//init with defaults
if(userWantsToChangeDefaults) std::cin >> val1 >> val2;//obviously this is more or less pseudocode
Test test(val1, val2);
}
于 2012-07-08T23:26:49.253 回答
0
只是为了证实我的提示“使用解析器”,这里有一个非常非常简单(阅读:缺少所有输入验证)的方法,基于 Boost Spirit。
你可以用普通的 IO 流来写这个,你基本上会得到@MFH 发布的内容。根据上下文,更简单的方法可能更合适。
#include <boost/fusion/adapted.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/support_istream_iterator.hpp>
struct MyClass
{
bool _a, _b;
MyClass(bool a, bool b) :_a(a), _b(b) { }
MyClass(){}
};
BOOST_FUSION_ADAPT_STRUCT(MyClass,(bool,_a)(bool,_b));
namespace qi = boost::spirit::qi;
int main()
{
std::cin.unsetf(std::ios::skipws);
boost::spirit::istream_iterator f(std::cin), l;
MyClass data;
using namespace qi;
auto optbool = bool_ | attr(false);
if (phrase_parse(f,l,
(optbool >> optbool),
qi::blank, data))
{
std::cout << "data._a: " << std::boolalpha << data._a << "\n"
<< "data._b: " << std::boolalpha << data._b << "\n";
} else
std::cerr << "Illegal input\n";
}
于 2012-07-08T23:32:09.043 回答