如何用集合初始化初始化C++/cx类?
问题描述:
我有这样的裁判等级:如何用集合初始化初始化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" };
我不想在这里使用一个构造函数。
答
我假设你的意思是你不想在预计的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!在课堂上还有一些额外的代码,但没关系,因为它在呼叫方中为我节省了一条线路。 –
您的ref类是一个interop类型,该属性实际上并不是该类中的字段。对于一个C++程序员来说,只需简单的语法糖。但它需要调用一个函数(set_x)来初始化该值,与初始化程序列表不兼容。您需要's1.x =“test”;',编译器自动创建Platform :: String并将其转换为接口方法调用。 –