CのC++ライブラリにいくつかのAPIをラップする必要があります。私はこれまで、クラスオブジェクト、extern "C"などの不透明ポインタを使用して、hereと記述しました。しかし、私が扱っているこの新しいライブラリは、リファレンスカウントのスマートポインタを広範に使用しています。私はスマートポインタの存在下でラッピングを行う方法がわかりません。Cでスマートポインタを返すC++関数をどのようにラップするのですか?
SmartPointer<MyClass> foo() {
SmartPointer<MyClass> ret(new MyClass); // Create smart pointer ret
ret->DoSomething(); // Do something with ret
return ret;
}
どのように私はCでfoo()
をラップすることができます。たとえば、のは、C++ライブラリは、以下の機能を持っているとしましょうか?明らかに、MyClass
オブジェクトを参照するC関数で使用できる不透明なポインタ(void*
または空の構造体ポインタなど)が必要です。私が考えた最初の選択肢は、ret
からMyClass
オブジェクトを抽出し、それをvoid*
にキャストすることでした。しかし、このvoid*
は、ret
がスマートポインタによって行われる自動削除のために範囲外になったときにぶら下がります(私が間違っていれば私を修正してください)。
もう1つの方法は、スマートポインタ(たとえばretPtr
)にポインタを割り当て、*retPtr=ret
とし、retPtr
への不透明なポインタを作成することです。私はこのオプションがうまくいくと思っていますが、これが最善の方法ですか?
何か助けていただければ幸いです。
私はあなたの最後の提案に同意します。 –
どのような種類のスマートポインタで、私はstdlibにSmartPointerというクラスがないことを知っています。これは問題のスマートポインタのセマンティクスに大きく依存します... – Vality
Cライブラリは実際に 'ObjectType'のメンバにアクセスする必要がありますか?それとも、しばらくの間ポインタを保持し、後でそれを解放するのですか?また、 'ObjectType'と' MyClass'の関係は何ですか? –