1

例えば

bool read(Input &input);

Input input; //error
bool success = read(input);

Inputにはデフォルトのコンストラクターがないため、エラーになります。

この場合、関数からInputオブジェクトを取得するために使用できるトリックはありますか?私が利用できるunique_ptrのトリックがあるはずだと思いますが、正確な方法はわかりません。他の方法をお気軽にご提案ください。

読み取り関数がどのように見えるかを例を挙げて提案してください。

この目的のためだけにInputの(意味のない)デフォルトコンストラクターを作成したくはありません。これは単なるばかげた例であるため、「Input」、「read」などの単語に特別な意味を付けないでください。 )。

4

4 に答える 4

1
bool read(unique_ptr<Input> &input)  // read asume input is disposable/empty
{    ....
  input.reset(new Input( a,d,c ) );
     ....
 }

....
unique_ptr<Input> input;      //error ?
bool success = read(input);
if (input)
  if (succes)
     input->X();
  else
     input->Y();
于 2013-02-21T14:17:15.027 に答える
0

コメントから、あなたの問題は関数を設計することであるようです

  • 失敗する可能性があります(失敗する場合は、呼び出し元に通知する必要があります)、

  • そうでない場合は、デフォルトの cconstructor を持たない型の値を生成します

最初のポイントは簡単です: 例外を使用します。

2 番目のポイントも簡単です。関数の戻り値機能を使用します。

すなわち、

Object foo()
{
    if( "didna wrok" )
    {
        throw std::runtime_error( "foo: I failed, miserably" );
    }

    return Object( arg1, arg2, arg3 );
}

これを行うには他にも多くの方法がありますが、上記の方法が最も自然で、これらの側面をサポートして完全に解決することを目的とした言語機能を直接使用します。

于 2013-02-21T14:18:27.377 に答える
0
unique_ptr<Input> input_ptr = read();

は次のようにread()定義されます。

unique_ptr<Input> read()
{
    .
    .
    .
    return unique_ptr<Input>(new Input(x,y,z));
}
于 2013-02-21T14:21:58.083 に答える
0

C+11 より前の環境にいる場合は、次を使用して回避策がありますmalloc

bool read(Input &input); // keep the function read intact 

Input* input = static_cast<Input*>(malloc(sizeof(Input))); // bypass constructor
bool success = read(*input);
...
free(input); // don't forget to free input later
于 2013-02-22T11:32:21.740 に答える