2016-11-10 16 views
1

私はこのREFクラスを持っている:集計初期化を使用してC++/cxクラスを初期化する方法は?

namespace N 
{  
    public ref class S sealed 
    { 
    public: 
     property Platform::String^ x; 
    }; 
} 

私が集計初期化子を持つ場所でそれを初期化するにはどうすればよいですか?

N::S s1 = { %Platform::String(L"text") }; 

コンパイラは

エラーC2440は言う:: は、私が試してみました 'N :: S'

に '初期化子リスト' から変換することはできません: '初期化します'また:

N::S s1 { %Platform::String(L"text") }; 

エラー:

エラーC2664: 'N :: S :: S(CONST N :: S%)': からの引数1を変換することはできません 'プラットフォーム::文字列^' に 'CONST N :: S%'

これは、このような標準C++で大幅に機能します:

struct T 
    { 
     wstring x; 
    }; 
T x { L"test" }; 

私はここにコンストラクタを使用する必要はありません。

+0

refクラスはinterop型です。プロパティは実際にはクラス内のフィールドではありません。 C++プログラマーのための便利な構文砂糖。しかし、イニシャライザリストと互換性のない値を初期化するには、関数(set_x)を呼び出す必要があります。 's1.x =" test ";'が必要な場合、コンパイラは自動的にPlatform :: Stringを作成し、それをインタフェースメソッド呼び出しに変換します。 –

答えて

0

投影されたWinRTタイプにpublicコンストラクタを必要としないことを意味すると思います。internalキーワードを「C++の内部は公開されていますが、interopを通して公開されません」という意味に使用できます。それはあなたが好きなら、あなたもあなたのパラメータのためのネイティブC++の型を使用できることを意味します:

また
namespace Testing 
{ 
    public ref class MyTest sealed 
    { 
    public: 
    property String^ Foo { 
     String^ get() { return m_foo; } 
     void set(String^ value) { m_foo = value; } 
    } 

    internal: 
    // Would not compile if it was public, since wchar_t* isn't valid 
    MyTest(const wchar_t* value) { m_foo = ref new String(value); } 

    private: 
    String^ m_foo; 
    }; 
} 

MainPage::MainPage() 
{ 
    // Projected type does NOT have this constructor 
    Testing::MyTest t{ L"Hello" }; 
    OutputDebugString(t.Foo->Data()); 
    t.Foo = "\nChanged"; 
    OutputDebugString(t.Foo->Data()); 
} 

あなたは文字列を保持するためにprivate変数を用意する必要はありません - あなただけのように自動プロパティを使用することができますあなたの元のコード - 私は明示的にすることを好む。また、C++コードの中から文字列にたくさんアクセスする必要がある場合は、アクセッサ関数internalを提供し、vtable呼び出しを行う必要はありません。

+0

ありがとうございます@ピーター!クラスのかなりの追加コードですが、呼び出し側に私の行を1行節約できるので大丈夫です。 –

関連する問題