2012-07-08 200 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"; 
}