windows C++-windows C++/CX简介(七)

2024-08-24 06:44
文章标签 c++ windows 简介 cx

本文主要是介绍windows C++-windows C++/CX简介(七),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在本文中,我们将介绍静态成员函数以及 Windows 运行时如何支持它们。Windows 运行时引用类型,在 C++/CX 中也称为 ref 类或运行时类可以具有静态成员函数。在 C++/CX 中,用于在运行时类中声明静态成员函数的语法与在普通 C++ 类中使用的语法完全相同。为了演示这一点,下面是一个具有一个静态成员函数的运行时类:

    public ref class KnownValues sealed{public:static int GetZero() { return 0; }private:KnownValues(); // This type can't be constructed};

请注意,我们已声明私有默认构造函数,以确保无法创建此类的实例。如果我们定义 ref 类并且不声明任何构造函数,则编译器将为该类型提供一个公共默认构造函数,就像为普通 C++ 类一样。可以定义一个可构造且具有静态成员的类型;我们只是将此类型设为不可构造,以使下一个示例更简单一些。

同样,用于调用运行时类声明的静态成员函数的语法与普通 C++ 语法完全相同。以下是我们调用 GetZero 的方式:

    int x = KnownValues::GetZero(); 

因此,至少从语法上讲,C++/CX 中的静态成员函数没有什么特别之处。但是,Windows 运行时支持静态成员函数的机制值得一提。

静态成员函数的实现

对静态成员函数的调用独立于声明该函数的类的任何实例。静态成员函数没有 this 指针。我们不需要创建 KnownValues 对象来调用其 GetZero 静态成员函数。为了允许运行时类具有静态成员函数,我们需要某种方法,允许我们在不先创建其声明类型的实例的情况下调用函数。

通过以下方式实现了对构造函数的支持:

  • 将每个构造函数转换为返回该类型的新实例的函数‘’
  • 定义一个接口(称为工厂接口),声明所有这些构造函数,
  • 定义一个运行时类(称为激活工厂),实现工厂接口‘’
  • 提供一种明确定义的方式来获取任意类型的激活工厂实例。

激活工厂允许我们实现与运行时类关联的函数,这些函数无需先创建该运行时类的实例即可调用。特定运行时类只能有一个与之关联的激活工厂,但该激活工厂可以实现多个接口。除了实现零个或多个工厂接口声明构造函数之外,激活工厂还可以实现零个或多个静态接口或者声明静态成员函数。

我们将使用 C++ 和 WRL 重新实现 KnownValues 类型,但我们不会讲得太详细,激活工厂和这里没有太多区别。首先,下面是运行时类及其静态接口的 IDL 声明,它们非常简单:

    [exclusiveto(KnownValues)][uuid(ca8c9b14-f2a3-4f1e-aa50-49bfa3a5dbd3)][version(1.0)]interface IKnownValuesStatics : IInspectable{HRESULT GetZero([out] [retval] int* value);}[static(IKnownValuesStatics, 1.0)][version(1.0)]runtimeclass KnownValues{}

KnownValues 上的静态属性指定 IKnownValueStatics 接口是 KnownValues 运行时类的静态接口。请注意,KnownValues 类型未声明它实现任何实例接口(即其主体为空)。这是因为永远不会创建 KnownValues 运行时类的任何实例。此运行时类实际上只是用于定义静态成员函数的容器,在 C# 术语中,这称为静态类。

激活工厂实现也很简单:

    class KnownValuesFactory : public ActivationFactory<IKnownValuesStatics>{InspectableClassStatic(RuntimeClass_WRLKnownValuesComponent_KnownValues, BaseTrust)public:STDMETHODIMP GetZero(int* value) override{*value = 0;return S_OK;}};ActivatableStaticOnlyFactory(KnownValuesFactory)

请注意,由于我们永远不会创建 KnownValues 的实例,因此我们实际上不需要在 C++ 中定义 KnownValues 类。我们只需要定义激活工厂,它实现 IKnownValueStatics 静态接口。

所有激活工厂还必须实现 IActivationFactory 接口。我们使用的 ActivationFactory 基类模板提供了此接口的默认实现,它对不可激活类型执行正确的操作。特定的运行时类可能既可激活又具有静态成员函数。在这种情况下,其激活工厂将同时实现工厂接口和静态接口。

调用静态成员函数

由于静态成员函数的实现方式与构造函数相同,因此调用静态成员函数的过程与调用构造函数的过程完全相同也就不足为奇了。需要两个步骤:首先,我们需要获取该类型的激活工厂,然后我们就可以调用该函数。调用 GetZero 的 WRL 代码如下:

    HStringReference classId(RuntimeClass_WRLKnownValuesComponent_KnownValues);ComPtr<IKnownValuesStatics> statics;RoGetActivationFactory(classId.Get(),__uuidof(IKnownValuesStatics),reinterpret_cast<void**>(statics.GetAddressOf()));int x = 0;statics->GetZero(&x);

 除了为简洁起见省略的错误处理之外,此代码等效于上面的 C++/CX 对 GetZero 的调用:

    int x = KnownValues::GetZero(); 

这篇关于windows C++-windows C++/CX简介(七)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101747

相关文章

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Python库 Django 的简介、安装、用法入门教程

《Python库Django的简介、安装、用法入门教程》Django是Python最流行的Web框架之一,它帮助开发者快速、高效地构建功能强大的Web应用程序,接下来我们将从简介、安装到用法详解,... 目录一、Django 简介 二、Django 的安装教程 1. 创建虚拟环境2. 安装Django三、创

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

MySQL 索引简介及常见的索引类型有哪些

《MySQL索引简介及常见的索引类型有哪些》MySQL索引是加速数据检索的特殊结构,用于存储列值与位置信息,常见的索引类型包括:主键索引、唯一索引、普通索引、复合索引、全文索引和空间索引等,本文介绍... 目录什么是 mysql 的索引?常见的索引类型有哪些?总结性回答详细解释1. MySQL 索引的概念2

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3