870920 Menu

JUCE类库var类和Value类详解

JUCE类库的var不仅是数据容器,更是一个功能强大的“万用型”数据类型,既可以保存一个具体类型的数值,又可以保存该类型的一整个数组。通过其构造函数的多个重载版本即可获知,var可代表的数据类型有:int, int64, bool, double, const char*, const wchar_t*, String, ReferenceCountedObject引用计数类的指针 ,DynamicObject键值对数组,甚至可以是某个函数(实质为函数指针)!

传统上,在使用变量之前,必须明确定义其数据类型,而使用var则无需这么做,直接给其赋值即可,无论是int,double,还是String,均可以。这种强悍的“泛型”特征使得var非常适合作为ValueTree中的属性值,也正是由于这一点,使ValueTree拥有了“超泛型”编程的能力。而这些只是var作为单个值来使用,将其作为容器时,可以代表一个数组,该数组中的每个元素均是var对象,这种情况下的构造函数原型为:
var (const Array& value);

如需访问var所代表的值,则通过该类重载的赋值运算符将其隐式转换为原始的基本类型,如此可将var对象的值转换为它所支持的任意类型,比如:即便原始类型为数值而并非String,也一样可以返回该数值的字符串表示形式(数值2的返回结果为字符串”2″)。

注意两点:

1、var是一个类,但三个字母均为小写。该类的默认大小为24个字节。

2、var对象可以是一个ReferenceCountedObject引用计数堆对象的指针,由于引用计数类可以是任意类的基类(该类必须继承了ReferenceCountedObject引用计数类),因此var对象实际上可以代表和持有任意类型的数据。如要得到指针数据所指向的原始数据,使用dynamic_cast强转即可(转换不成功,则返回nullptr,因此使用前要进行非空检测)。

var类的重要方法及作用(网站发布,略)。


相比于var,Value类有以下特点:

 封装了一个var对象,即:Value对象其实就是一个var对象的容器或“包装”。

 Value所持有的数据(即Value对象的值)可共享,而并不是每个数据都在内存中建立一个副本。也就是说,多个Value对象可代表同一个实际数据,其中一个Value的值发生改变,其他Value对象的值一并改变,具有关联性。内部原理是Value类使用了共享和弱引用技术。因此,可将Value类称为“共享式万用数据类型”。要共享某个已有的Value值,使用成员函数:referTo (Value对象)。

 Value对象的值发生改变时可产生消息,所产生的消息可被继承了Value::Listener类的任何类所捕获和处理 。要实现此功能,需做到两点:一是捕获类继承Value::Listener类并实现其纯虚函数valueChanged(),二是Value对象需绑定捕获器,即:Value对象.addListener()。此操作的流程与Button、Slider等类的消息产生与捕获完全一致。

假设UI中有3个推子,改变其一,其他两个一并改变。此时,使用Value类再合适不过:

Value类的重要方法及解释(网站发布,略)。