2011-12-27 14 views
1

私はC++でいくつかのユーティリティ関数のライブラリを開発しています。私はそのライブラリ内の関数のシグネチャに関して疑問を持っています。関数がいくつかのパラメータをとり、値を返す場合、その関数の結果が格納されている変数もその関数のパラメータとして渡されますか?どのようにエラー条件を処理し、エラーの値を返すべきですか?関数の設計決定

+0

"C++"と "C"の両方にタグ付けしました。答えはそれぞれに異なる可能性があるので、1つを選んでください。 –

+0

これは選択と視点の問題ですので、組織が策定したコーディングガイドラインに従ってください。 –

+0

@OliCharlesworth:各言語の違いを教えてくれれば幸いです。 –

答えて

2

C++の場合は、結果を返し、例外を含むエラーを処理する必要があります。

int calc_with_error() { 
    throw yourExceptionClass("Message"); 
} 
int calc() { 
    return 5; 
} 
int main() { 
    int tmp=calc(); 
    cout << calc; 
} 

しかし、結果は関数から呼び出しコンテキストにコピーされます。プリミティブなデータ型では、これが最速の方法です。あなたは、複雑なデータ構造を持っている場合しかし、それは結果パラメータへの参照を渡すために高速になります - それは、上記の溶液のようにきれいなコードではありませんが、一例は次のようになります。

void calc(vector<int> &result) { 
    result.clean(); 
    result.add(5); 
} 
int main() { 
    vector<int> tmp; 
    calc(tmp); 
    //Do something with the vector 
} 
+0

戻り値の最適化について忘れないでください。戻り値のコピーは、しばしば最適化されます。 –

1

いくつかのオプションがあり、主に優先事項です。
あなたがすべきことは、ほとんどの場合、出力とエラーを別々に保つことです。
戻り値としてsuccess/errorを返し、参照渡しの出力パラメータでデータを返すとよいでしょう。

これらの操作は行わないでください。
1.エラー表示として「マジック値」を使用します。
2.グローバル変数を使用してデータを返します。

+0

これはC言語では当てはまりますが、C++ではそうではありません。 –

+0

C++での違いを教えてください。ありがとう。 –

+0

@RakeshK:例外は関数の署名には現れません。 –

1

人々は頻繁に戻らないように私に教えてこれは非常にベストプラクティスではないため、エラー値です。例外をスローするのが最良ですが、これはエラーコードよりも処理が容易です。また、出力パラメータは良いです、私は大きなデータのためにそれらを使用します。単純な戻り値の場合、戻り値は有効でなければなりません。お見せするために

、もちろん、これはデザインではあまりよくないです。

void checkSomething(bool& output) 
{ 
    output = doCheckages(); 
} 

bool checkSomething() 
{ 
    return doCheckages(); 
} 

しかしyoureの大きなクラス/構造を処理し、あなたが知っていればはるかに優れていますあなたはそれのインスタンスをたくさん持ちたいとは思わないので、出力パラメータとして渡す方が良いかもしれません。

関連する問題