10

私は struct を持っていFooます。擬似コード:

def FindFoo:
   foo = results of search
   foundFoo = true if a valid foo has been found  

   return foo if foundFoo else someErrorCode

C++でこれを達成するにはどうすればよいですか?

多数の不正確な点を削除するために編集されました。

4

8 に答える 8

15

C++ オブジェクトを null または空にすることはできません。ポインターは、何も指していないことを示す null ポインター値を保持できます。

一般的な解決策は、例外をスローすることです。それ以外の場合は、ポインターを使用します。一時的なアドレスを返していないことを確認してください。

他の言語の知識で C++ を独学しようとすることはお勧めしません。初心者向けの優れた本を手に取ってください。それが学習の最良の方法です。

于 2010-06-15T23:40:40.977 に答える
3

例外をスローします。それが彼らの目的です。

于 2010-06-15T23:45:35.130 に答える
3

boost::optionalニーズに合っているかどうかを調べて確認できます。でも:

見つかった場合は foo を返しますFoo そうでない場合は someErrorCode

これにより、foo が見つからない場合は、例外をスローした方がよいのではないかと思います。

于 2010-06-15T23:53:55.373 に答える
1

これを行う 1 つの方法は、foo へのポインターを返すことです。

public Foo* findFoo()
{
    return fooFound ? new fooResult() : NULL;
}

おそらく空の実装での拡張NullFooとして、何らかの種類のを定義する別の可能性。後者のアイデアの詳細については、Null オブジェクト パターンを参照してください。structFoo

編集:変更された質問は多少異なります。他の人が言及したように、上記のいずれかを実行するのではなく、例外をスローすることをお勧めします。

于 2010-06-15T23:36:55.430 に答える
0

foo を見つけることは本当に例外的な状況ではないでしょうか? 次に、例外をスローします。fooが見つからないことを期待していますか?関数にエラー コードを返させ、参照パラメーターを介して foo を渡します。ここで、foo は、関数がエラーを返さない場合にのみ有効です。

于 2010-06-16T15:12:53.417 に答える
0

それはC#でも機能しません。Foo へのポインターを返す必要があります。

于 2010-06-15T23:35:16.450 に答える
0

C++ では、ポインターや標準ライブラリー以外のライブラリー ソリューションに頼らない限り、これは不可能です。(Boost は標準ライブラリの一部ではなく、サードパーティのソリューションです。)

C# では、Nullable<Foo>.

Billy のコメントに反して、構造体は参照型ではなく値型であり、Nullable は組み込みだけでなく任意の値型に適用できます。以下は問題なくコンパイルされます。

struct Test {
    int Blah;
}
void Main() {
    System.Nullable<Test> proof;
}
于 2010-06-15T23:41:21.223 に答える
-1

C# でもこれを行うことはできません。コンパイラを満足させるためnew Foo()ではなく、を返す必要があります。null

C++ の場合も同様です。値で返す場合は、構造体をインスタンス化する必要があります。そうでない場合は、ポインターで返す必要があります (その場合new、別の方法で割り当てられたポインターへのポインターを ing または返すことになり、厄介な所有権移転セマンティクスが方程式に組み込まれます)。

編集:あなたの更新に基づいています。「見つからない」ことを示す値または「null」メタ値のいずれかを返したいようです。これは、いくつかの方法で行うことができます。

  1. throw失敗した場合、それ以外の場合は無条件に値を返します
  2. deletポインターを返します-しかし、これは、それが長期的にメモリに残るものでない場合、空中に置く責任を残します
  3. .NET と同じ方法で条件を処理する [テンプレート化された] ラッパー オブジェクトでラップします(誰かに適切な更新を知らせますNullable<T>: @Mike Seymour はそれが .boost::optional<foo>
  4. Null Object パターンを使用して、クライアント側で有効な結果として扱われるときに正しいことを行う適切な値を返します
于 2010-06-15T23:36:20.080 に答える