【问题标题】:CX view of C++ classesC++ 类的 CX 视图
【发布时间】:2014-02-20 01:56:35
【问题描述】:

我正在编写一个程序,它有一个可移植的 C++ 后端,我们想为其创建一个 WinRT Xaml 前端。我想将我们的模型保留在纯 C++ 代码中,并在 C++/CX 中创建一个视图,该视图反映了我们可以在前端传递和使用的 C++ 模型。有什么标准方法吗?

例如:

class Person
{
public:
    const std::wstring GetName() const;
    void SetName(const std::wstring& value);
private:
    std::wstring m_Name;
}

ref class PersonMirror : INotifyPropertyChanged
{
public:
    property Platform::String^ Name
    {
        Platform::String^ get();
        void set(Platform::String^ value);
    }
private:
    std::shared_ptr<Person> m_Person;
}

在这方面我不知道该怎么做:

  • 如何从本机类获取关联的 ref 镜像类。我可以将 void* 转换为 PersonMirror^ 并与 GC 讨论持有对该对象的引用吗?
  • 是否有用于触发事件的 C++ 实现?或者我想如果我可以保持这是一对一的关系,我也许可以只使用函数指针?

【问题讨论】:

  • 您真的需要为您拥有的每个 C++ 类创建一个 CX 包装器吗?

标签: windows-runtime c++-cx


【解决方案1】:

您不能简单地将 void* 转换为 PersonMirror^。您必须使用“ref new”来创建类的 WinRT 实例,然后将数据(或指向它的指针)从 Person 复制到 PersonMirror 中。您可以使用 PersonMirror 构造函数从 ISO C++ 类中复制各个字段,或者您可以像所做的那样复制 shared_ptr,并在 ref 类中为其提供公共访问器。这是一个很好的方法。注意:C++/CX 中没有“GC”; ref 类基本上只是一个智能指针。

• 您可以在同一进程中的 ref 类和 ISO C++ 类之间使用您喜欢的任何事件机制。唯一的限制是 ref 类中的任何公共类型都必须与 WinRT 兼容。要在 PersonMirror 中公开回调或函数对象事件处理程序,请为其提供内部可访问性,使其对 WinRT 接口不可见,但您的 ISO 代码仍然可以访问它。

MSDN 上的Reversi 示例演示了一个由 C++/CX 包装类包装的 ISO C++ 类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2016-03-02
    • 2023-03-07
    • 2011-11-25
    • 2014-12-14
    相关资源
    最近更新 更多