Windows runtime 如何初始化c++/具有聚合初始化的cx类?

Windows runtime 如何初始化c++/具有聚合初始化的cx类?,windows-runtime,c++-cx,Windows Runtime,C++ Cx,我有这个参考类: namespace N { public ref class S sealed { public: property Platform::String^ x; }; } 如何使用聚合初始值设定项就地初始化它? 我试过: N::S s1 = { %Platform::String(L"text") }; 但是编译器说 错误C2440:“正在初始化”:无法从“初始值设定项列表”转换为 'N::S' 此外: 错误是: 错误C2664

我有这个参考类:

namespace N 
{       
  public ref class S sealed
  {
    public:
      property Platform::String^ x;
  };
}
如何使用聚合初始值设定项就地初始化它? 我试过:

N::S s1 = { %Platform::String(L"text") };
但是编译器说

错误C2440:“正在初始化”:无法从“初始值设定项列表”转换为 'N::S'

此外:

错误是:

错误C2664:“N::S::S(常量N::S%)”:无法从转换参数1 'Platform::String^'到'const N::S%'

<>这与标准C++非常类似:

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

我不想在这里使用构造函数。

我想你是说你不希望在投影的WRET类型上有一个<代码>公共> /Cuff>构造器-没问题,你可以使用<代码>内部< /Cord>关键字来表示“C++内部的公共但不通过互操作来公开”。这意味着如果您喜欢:您可以使用本地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
变量来保存字符串——您可以像在原始代码中一样使用auto属性——但我更喜欢显式。它还意味着,如果需要从C++代码中大量访问字符串,可以提供内部< /代码>访问器函数,而不必通过VTAL调用来获取它。

< P>我假定您不希望在WiRT类型上使用<代码>公共< /代码>构造函数-没有问题,你可以使用内部< /Cord>关键字来表示“C++内部的公共但不通过互操作来公开”。这意味着如果您喜欢:您可以使用本地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
变量来保存字符串——您可以像在原始代码中一样使用auto属性——但我更喜欢显式。这也意味着,如果需要从C++代码中大量访问字符串,可以提供<代码>内部您的REF类是互操作类型,属性实际上不是类中的字段。只是一个方便的语法糖为C++程序员。但它需要调用函数(set_x)来初始化该值,这与初始值设定项列表不兼容。您需要
s1.x=“测试”,编译器自动创建Platform::String并将其转换为接口方法调用。您的ref类是互操作类型,属性实际上不是类中的字段。只是一个方便的语法糖为C++程序员。但它需要调用函数(set_x)来初始化该值,这与初始值设定项列表不兼容。您需要
s1.x=“测试”,编译器自动创建Platform::String并将其转换为接口方法调用。谢谢@Peter!课堂上有很多额外的代码,但这没关系,因为它在呼叫端为我节省了一行代码。谢谢@Peter!类中有相当多的附加代码,但这没关系,因为它在调用端为我节省了一行代码。