ユーザーが main() に 2 つの bool 値を入力する必要があります。これは、別のファイルにあるクラス関数の引数として入力されます。ただし、bool 値が入力されていない場合は、ユーザーがクラスのデフォルト コンストラクターを呼び出すようにしたいと考えています。どうやってやるの?
3 に答える
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 に答える
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 に答える
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 に答える