调用默认构造函数

时间:2012-07-08 23:00:42

标签: c++

我需要用户在main()中输入两个bool值,然后将其作为在单独文件中找到的类函数中的参数输入。但是,如果没有输入bool值,我也希望用户在类中调用默认构造函数。我怎么能这样做?

3 个答案:

答案 0 :(得分: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);

并让班级的用户使用适当的。

答案 1 :(得分: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);
}

答案 2 :(得分:0)

为了证实my hint 'use a parser',这是一个非常简单的(阅读:缺乏所有输入验证)方法,基于Boost Spirit。

你可以用普通的IO Streams写这个,你基本上可以得到@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";
}