2016-11-10 152 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!在课堂上还有一些额外的代码,但没关系,因为它在呼叫方中为我节省了一条线路。 –