2

C ++ / CX構文を使用してライブラリを作成し、他のプロジェクトで使用したいと思います。

ご存知のように、プレーンな古いデータ構造にはメソッドや演算子を含めることができないため、動作を提供するために別のクラスで静的メソッドを作成するなどの作業を行う必要がありました。

また、このようなコードを書くことはできません:

private:
    int _D;
public:
    property int& D { int& get() {return _D;}}

または、このプロパティを次のようなメソッドに渡します。

void SampleMethod(int& d);

Windowsランタイムライブラリにこれらの制限がある理由がわかりません。

C ++ / CXおよびWindowsランタイム拡張機能を.libファイルにコンパイルするにはどうすればよいですか?または、WRLプロジェクト全体のコードファイルを別のプロジェクトでプリコンパイルするにはどうすればよいですか?

4

2 に答える 2

4

WinRTは、言語を超えた使用を目的としたABIです。少なくともC ++、C#、VB、およびJSです。このため、提供される構成は、これらの言語で簡単に表現できるものに制限されます。たとえば、参照によって戻る場合、C#コードはそれをどのように使用しますか?

C++からのみ使用する静的ライブラリをC++で記述したい場合は、言語拡張をできるだけ避け、WinRTオブジェクトを渡す必要がある場所にのみ保持することをお勧めします。そのシナリオでは、完全なC ++/CXを使用することで得られるメリットはありません。

于 2011-12-05T17:35:05.127 に答える
3

「struct」が基本的に「すべてのメンバーがパブリックであるクラス」であるC++とは異なり、Windowsランタイムでは、「struct」は値型です。そのため、プロパティアクセサーを含むメソッドを持つことはできません(値型はメソッドを持つことができません)。

さらに、構造体は値型であるため、常に値によって渡されます。これは、構造体をメソッドに渡すには、構造体の内容をコピーする必要があることを意味します(値型は、すべてのコンシューマーがデータ型の独自のコピーを操作することを意味します)。この結果、構造体のサイズはかなり小さくする必要があります(「16バイト未満」と考えてください)。

より大きなオブジェクトを渡す必要がある場合は、代わりにクラスを使用してください。クラスは参照によって渡されるため、任意の量のデータを保持できます。

于 2011-12-06T03:57:00.760 に答える