1

問題

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 番目のアプローチ

私が考えることができる別の可能性は、指定されたサイズのバッファーへのポインターを、失敗する可能性のある各関数に渡すことです。これはエラーメッセージでいっぱいになりますが、見た目が面倒です。

どのようにしますか?そのような問題に対処する事実上の標準的な方法はありますか?

4

1 に答える 1

1

自分の質問に答える。

少し変更した2番目のアプローチを使用すると思います。

コンストラクターは、失敗する可能性のある他のすべての関数と同様に戻り、エラーの場合でも意味のある値に設定される out パラメーターをBOOL受け入れるため、それを使用できます。MyClass *MyClass_getLastError(myObj)

これにより、余分な機能が取り除かれMyClass_isInErrorState()ます。

MyClassC側では不透明なポインタになり、C++側では、クラスのオブジェクトへのポインタ(おそらくNULL)とエラー文字列を含むソートのバッファを保持する構造体へのポインタになります。

于 2015-07-13T17:16:11.277 に答える