私は struct を持っていFoo
ます。擬似コード:
def FindFoo:
foo = results of search
foundFoo = true if a valid foo has been found
return foo if foundFoo else someErrorCode
C++でこれを達成するにはどうすればよいですか?
多数の不正確な点を削除するために編集されました。
私は struct を持っていFoo
ます。擬似コード:
def FindFoo:
foo = results of search
foundFoo = true if a valid foo has been found
return foo if foundFoo else someErrorCode
C++でこれを達成するにはどうすればよいですか?
多数の不正確な点を削除するために編集されました。
C++ オブジェクトを null または空にすることはできません。ポインターは、何も指していないことを示す null ポインター値を保持できます。
一般的な解決策は、例外をスローすることです。それ以外の場合は、ポインターを使用します。一時的なアドレスを返していないことを確認してください。
他の言語の知識で C++ を独学しようとすることはお勧めしません。初心者向けの優れた本を手に取ってください。それが学習の最良の方法です。
例外をスローします。それが彼らの目的です。
boost::optional
ニーズに合っているかどうかを調べて確認できます。でも:
見つかった場合は foo を返しますFoo そうでない場合は someErrorCode
これにより、foo が見つからない場合は、例外をスローした方がよいのではないかと思います。
これを行う 1 つの方法は、foo へのポインターを返すことです。
public Foo* findFoo()
{
return fooFound ? new fooResult() : NULL;
}
おそらく空の実装での拡張NullFoo
として、何らかの種類のを定義する別の可能性。後者のアイデアの詳細については、Null オブジェクト パターンを参照してください。struct
Foo
編集:変更された質問は多少異なります。他の人が言及したように、上記のいずれかを実行するのではなく、例外をスローすることをお勧めします。
foo を見つけることは本当に例外的な状況ではないでしょうか? 次に、例外をスローします。fooが見つからないことを期待していますか?関数にエラー コードを返させ、参照パラメーターを介して foo を渡します。ここで、foo は、関数がエラーを返さない場合にのみ有効です。
それはC#でも機能しません。Foo へのポインターを返す必要があります。
C++ では、ポインターや標準ライブラリー以外のライブラリー ソリューションに頼らない限り、これは不可能です。(Boost は標準ライブラリの一部ではなく、サードパーティのソリューションです。)
C# では、Nullable<Foo>
.
Billy のコメントに反して、構造体は参照型ではなく値型であり、Nullable は組み込みだけでなく任意の値型に適用できます。以下は問題なくコンパイルされます。
struct Test {
int Blah;
}
void Main() {
System.Nullable<Test> proof;
}
C# でもこれを行うことはできません。コンパイラを満足させるためnew Foo()
ではなく、を返す必要があります。null
C++ の場合も同様です。値で返す場合は、構造体をインスタンス化する必要があります。そうでない場合は、ポインターで返す必要があります (その場合new
、別の方法で割り当てられたポインターへのポインターを ing または返すことになり、厄介な所有権移転セマンティクスが方程式に組み込まれます)。
編集:あなたの更新に基づいています。「見つからない」ことを示す値または「null」メタ値のいずれかを返したいようです。これは、いくつかの方法で行うことができます。
throw
失敗した場合、それ以外の場合は無条件に値を返しますdelet
ポインターを返します-しかし、これは、それが長期的にメモリに残るものでない場合、空中に置く責任を残しますNullable<T>
: @Mike Seymour はそれが .boost::optional<foo>