2016-05-26 22 views
0

私のプロジェクトがMSVCでコンパイルされたライブラリとリンクするためにプロジェクトをGCCに準拠させようとしています。問題は、このライブラリもlinux x86、x86_64、GCCでコンパイルされたアームプラットフォーム(そして私のプロジェクトはクロスプラットフォーム)にも存在し、プラットフォーム依存の(そしてコンパイラ依存の)コードをたくさん書いたくないということです。また、プロジェクトにリンクされた他のライブラリは、GCC(ffmpegやvlcなど)によってコンパイルされるように設計されており、MSVCに移行する可能性はありません。 私はCスタイルラッパーライブラリ(元のヘッダーに基づいて)を書いています。C++からポインタを構築する

コンストラクタとクラスのデストラクタは、この方法で行われています。

__declspec(dllexport) void* myClass_myClass() 
{ 
    void* ptr = new myClass(); 
    return ptr; 
} 
__declspec(dllexport) void myClass_unmyClass(void* ptr) 
{ 
    delete((myClass*)ptr); 
} 

この部分はMSVCでコンパイルされ、元のライブラリにリンクされています。あなたが見ているように(それは依存性ウォーカーで見ることができます)、私はGCCとリンクできるCスタイルのエクスポートを持っています。メモリを割り当て、オブジェクトを作成し、設計通りに動作します。

私はクラスを含むこのラッパーの第2部分を書いており、GCCでコンパイルされ、プロジェクトにリンクされます。ライブラリの元のヘッダーに基づいている必要があります(このライブラリのlinux版とwindows版の両方で元のものと同じように動作するようにする必要があります)。私はクラスのコンストラクタとデストラクタを作る方法を疑問に思っています。

class MyClass 
{ 
public: 
    MyClass() 
    ~MyClass() 
} 

元のヘッダーにあるとしましょう。

私のc-style "consturctor"と "destructor"への呼び出しをバイパスするために.cppでどのように定義できますか?(元のコンストラクタとデストラクタへの呼び出しをバイパスします) コンストラクタでポインタをthisに割り当てることは素晴らしいことですが、これは禁止されています。

P.S.私はクラスの内部がありません。彼らはすべての

private: myClassImpl* m_pImpl; 

ので、私はコピーコンストラクタを使用することはできませんがあります。私ができたとしても、私は同じオブジェクトを2回構築したくありません。

+0

「バイパス」とはどういう意味ですか?また、 'void *'を使う理由もありません。 'MyClass *'を使う。純粋なC言語で理解できるようにするには、 'struct MyClass *'(またはtypedefを使用)を使用できます。 – ymett

+0

@ymett私のCスタイルの「コンストラクタ」をmyClassの元のコンストラクタを何らかの形で呼び出し、作成したクラスへのポインタとして返されたポインタを取得することを意味します。 'void *'の代わりに 'myClass *'を使うのは正しいかもしれませんが、C言語の "クラスへのポインタ"のようなものがないとどうしたらいいですか? – ElDorado

+0

「バイパス」はあなたが望む言葉ではないと思います。構造体とクラスはC++で同じものですが、Cにはポインタから構造体があります。 – ymett

答えて

1

ラッパークラスは、コンストラクタでmyClass_myClass()を呼び出し、返されたポインタをメンバとして格納し、格納されたポインタのデストラクタでmyClass_unmyClass()をコールするハンドルクラスにする必要があります。元のクラスのすべてのメンバー関数はラッパーにコピーする必要がありますが、ストアされたポインターの元の関数(ラッパー "C"関数を介して)を呼び出すだけです。コピーコンストラクタやコピー代入演算子には注意してください。デフォルトでは正しいことはありません。適切なラッパー "C"関数を呼び出すには、それらを削除するか、またはそれらを実装する必要があります。

+0

これは良い解決策です。しかし、このアイデアは、ライブラリの元のヘッダーを変更することではありませんでした(私が言ったように、同じクラスのこのライブラリのLinux版がうまく機能するので)。 しかし、!多分私はこのポインタを格納するためにそのmyClassImpl * m_pImpl変数を使用することができます。 これは、私が避けようとしていた2回のラッパークラスと1つのクラスのコンストラクターを呼び出しますが、とにかくそれがトリックを行うことがあります。 – ElDorado

関連する問題