2016-11-10 212 views
1

我有這樣的裁判等級:如何用集合初始化初始化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的ñ:: S%)':不能從 '平臺::字符串^' 轉換參數1至 'const的ñ:: 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關鍵字來表示「public inside C++ but not not through 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

謝謝@Peter!在課堂上還有一些額外的代碼,但沒關係,因爲它在呼叫方中爲我節省了一條線路。 –