2

重複の可能性:
C ++/CLI混合モードDLLの作成

私はc++cliを使用してC++クラスをラップしています。ヘッダーファイルは次のようになります。

pabcon.h

class PABCon {
private:
        unsigned int maxIndex;      
        long byteSize;  
public:
    __declspec(dllexport) inline unsigned int GetMaxIndex() { return this->maxIndex; };
    __declspec(dllexport) void invertData();
};

非インライン関数を次のようにラップしています。

pabconwrapper.h

public ref class PABConWrapper
{
private:
    PABCon *pabc;

public:
    PABConWrapper();
    ~PABConWrapper();
    void invertData();
};

pabconwrapper.cpp

PABConWrapper::PABConWrapper() : pabc(new PABCon())
{

}

void PABConWrapper::invertData()
{
    pabc->invertData();
}

PABConWrapper::~PABConWrapper()
{
    delete pabc;
}

私の質問は次のとおりです。

1)インラインc ++関数をラップする最良の方法は何ですか?

2) pabcon.hで定義されたプライベート変数をどうすればよいですか?どういうわけかそれらを包むべきですか?

ありがとう

PS私は4年前に前回C++に触れ、それ以来C#でコーディングしました。

4

1 に答える 1

2

インライン:メソッドのタグ付けをインラインにすると、コンパイラーは関数呼び出しを発行せず、代わりにメソッドの内容を取得して、呼び出し元の関数に直接配置するように指示されます。これは単なる助言であり、コンパイラはとにかく関数呼び出しを発行することを選択できると思います。とにかく、C ++ / CLIからこの関数を呼び出すときは、特別なことをする必要はないので、ラップするときに特別なことをする必要はありません。他の方法と同じようにラップするだけです。

プライベート変数:プライベート変数の場合、使用するアンマネージC++コードPABConはそれらにアクセスできません。のパブリックインターフェイスはPABConパブリックメソッドにすぎないため、心配する必要があるのはそれだけです。(C ++クラスにパブリック変数がある場合は、C ++ / CLIでプロパティを作成してそれらをラップします。)

~PABConWrapper:C ++ / CLIでは、~はデストラクタではなく、disposeメソッドです。現在実装されているように、新しいクラスを破棄するのを忘れると、メモリリークが発生します。少なくとも、に切り替えて、~代わり!にファイナライザーを宣言してください。理想的には、との両方!を実装~し、両方のメソッドでアンマネージオブジェクトを削除し(適切なnullチェックを使用)、他のメソッドで適切なnullチェックを追加します。これは、IDisposableの適切で適切な実装になります。

于 2013-01-18T13:45:44.350 に答える