問題
C++ クラスがあるとします。
そのコンストラクターとメソッドを C にエクスポートしたいとします。
「C 消費のための C++ クラス API のラッピング」の質問に対する解決策で与えられたアドバイスに従ったとします。
ここで、クラス コンストラクターが 1 つ以上の例外をスローできるとします。これは、C の世界に戻る前に C++ 側でキャッチする必要がありますが、発生したばかりのエラーに関する情報を C ユーザーに取得する機会を与えます。
最初のアプローチ
NULL ポインターが返されたことを確認MyClass_new()
し、関数を使用してライブラリで発生した「最後のエラー メッセージ」を取得できますが、コンストラクターが失敗した場合、エラー取得に適切なコンテキストを提供するオブジェクトがないため、グローバル変数を使用する必要があります。ただし、ライブラリの再入可能性を損なう最後のエラーを保持するために使用されます。
2 番目のアプローチ
私が思いつく別の可能性は、実際に私が思いついた解決策ですが、クラスがコンストラクター自体の内部で例外をトラップし、それをエラーメッセージに変換して、オブジェクトを一種の「エラー状態」にすることです。
それぞれの後
MyClass myObj = MyClass_new();
次のチェックが実行されます
if (MyClass_isInErrorState(myObj))
エラーメッセージは次のステートメントで取得されます
const char *error = MyClass_getLastError(myObj);
3 番目のアプローチ
私が考えることができる別の可能性は、指定されたサイズのバッファーへのポインターを、失敗する可能性のある各関数に渡すことです。これはエラーメッセージでいっぱいになりますが、見た目が面倒です。
どのようにしますか?そのような問題に対処する事実上の標準的な方法はありますか?