如何使用聚合初始化初始化c ++ / cx类?

时间:2016-11-10 11:20:23

标签: 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'

此外:

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

,错误是:

  

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

这对标准的c ++非常有用:

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

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

1 个答案:

答案 0 :(得分:0)

我认为你的意思是你不想在预计的WinRT类型上使用public构造函数 - 没问题,你可以使用internal关键字来表示" C ++中的public但不是通过互操作曝光#34;这意味着如果您愿意,甚至可以使用本机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调用来获取它。