870920 Menu

JUCE类库数据容器4-1

JUCE类库中,数据容器的地位与重要性相当于C++中的STL。用该类库编程,甚至完全可以不用C++的标准库。JUCE相当一批数据容器为线程安全的类模板。其中,第一个模板参数为容器要保存的数据类型,第二个模板参数为CriticalSection临界区(互斥)类型,该模板参数有默认值(一个虚假的临界区对象)。如需确保线程安全,将其替换并显式设置为临界区对象即可。

JUCE的数据容器类相当多,本节只列出若干重要且常用的。

1、OwnedArray <元素类型, 临界区对象>

OwnedArray自有数组是JUCE库中最重要的数据容器之一,它是一种数组类型的数据容器,用来保存某个类的对象的内存地址(指针),支持下标运算符。从数组中移除某个元素(指针)时,自有数组将自动销毁并释放该指针所指的堆内存。也就是说,本容器可自行管理元素的生命期——这一点非常方便。

可将自有数组类的第二个模板参数TypeOfCriticalSectionToUse设置为具体的临界区对象,以确保本类的所有函数均线程安全。

2、Array <元素类型, 临界区对象>

JUCE类库的Array相当于STL中的vector,可自动调整大小。Array用来保存原始类型的数据、可按值拷贝的对象和任意类型的指针。比如:Array<int>, Array<Rectangle>或 Array<MyClass*>。

可按值拷贝的对象需满足以下条件:
 必须具有拷贝构造函数和赋值运算符重载,无论是自定义的,还是编译器自动生成的。
 可使用memcpy()分配内存,且不会出现问题。即: 外部的指针或引用可使用该对象的全部功能。

Array的构造函数有多个版本,可使用一个普通的数组作为构造参数来初始化本类的对象(数组名和元素个数,或者只给出数组名,但该数组的最后一个元素为空值或nullptr)。

3、Component

Component是JUCE类库GUI编程的核心与根本,它不仅是一个可以显示的屏幕矩形区域,还是一个非常重要的“双重”数据容器(一是容纳并显示子组件,二是自身的属性容器),作为容纳并显示子组件的组件容器,该类持有一个数组对象:
Array childComponentList;

正是该对象用于存储本组件所容纳的所有子组件(指针)。Component类的addChildComponent()添加一个子组件,addAndMakeVisible()添加并显示一个子组件,removeChildComponent()基于给出的索引移除某个子组件,deleteAllChildren()移除并销毁所有子组件、getChildComponent()基于给出的索引获取某个子组件等函数,其内部实现均是由childComponentList数组对象来完成的(添加移除元素)。针对本组件内的所有子组件的操作,往往使用以下形式的遍历语句:

Component类作为自身属性容器,通过getProperties()函数所返回的NamedValueSet引用对象来完成,此对象是本类的数据成员,它本身就是一个键值对数据容器,其使用介绍参见本小节的后续部分。

4、SelectedItemSet

SelectedItemSet 类模板专用于存储逻辑上处于“已选择”状态的元素,元素可为各种类型的指针和整型数据(比如项目ID)等等。该类有大量专门处理选择/不选等操作的成员函数。

本类继承自ChangeBroadcaster,选择或不选项目时将自动产生可变消息。内容组件类可继承ChangeListener类以捕获处理本类所产生的消息。

使用SelectedItemSet类模板可非常方便的解决GUI编程中组件选择与否的问题。

5、PropertySet

PropertySet是一个重要的键值对数据容器基类,用于保存各类属性值的集合,属性名称为String类型,属性值则为var类型,可将属性值返回为String、int、float、bool等类型的数据。本类适合于保存程序中系统设置的各类属性值,内置了临界区对象(锁),因此,对该集合的操作是线程安全的。

PropertySet类的派生类PropertiesFile专用于保存程序属性,可将属性值写入磁盘文件中,并从磁盘文件中读取,属于方便实用的功能类。如果说这两个类是实现程序属性读写的功能类和数据模型,那么ApplicationProperties类则是实现此功能的接口,该类的数据成员即是PropertiesFile类的对象,另外,程序设置通常保存为XML格式的文档,因此,还需要XmlElement类的对象来读写数据(通常声明为作用域指针,上述两个功能类中有具体的函数可直接返回XmlElement类的指针)。这些类协同配合,可实现各类程序属性的读取与写入。

6、NamedValueSet

已命名的var对象的集合,即具有属性名称和所对应的属性值的集合。属性名称为Identifier标识符类型,属性值为var类型。添加var对象的函数为set(),获取集合中某个var对象的函数为getWithDefault(),其他操作函数与上述容器类大同小异。本类有两个非常实用的函数:将集合中的var对象的属性值保存到XML中,并可从XML中恢复已保存的var属性值。