2012-07-08 309 views
2

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

+3

你有任何代码可以显示吗?你卡在哪里? – sehe 2012-07-08 23:01:35

+2

你到目前为止取得了哪些进展? – reuben 2012-07-08 23:01:45

+1

作业?没关系,但我们应该知道。 – DavidO 2012-07-08 23:02:53

回答

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

并让类无论使用哪一个适当的用户。

+0

尽管如此,在调用代码中使用默认值100%更简单,更清洁,并在用户不输入数据时将其提供给构造函数... – MFH 2012-07-08 23:11:38

+0

@MFH您可能是对的。问题不是100%清楚。为什么不把你提出的方法写成答案,以便OP有更多的选择。 – mathematician1975 2012-07-08 23:20:33

+1

你应该真的失去'TestClass test_instance();'的括号,以免你声明一个函数。 – chris 2012-07-08 23:25:54

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

只是为了证实my hint 'use a parser',这里是一个非常非常简单(读:缺乏所有输入验证)方法,基于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"; 
}