Doom3 CVarSystem分析

来源:互联网 发布:nginx server配置 编辑:程序博客网 时间:2024/05/22 06:27
转发请注明出处
CVarSystem是用来方便管理控制台变量的。其中核心类有idCVar类
与 idCVarSystem。 其中idCVarSystemLocal实现了idCVarSystem类。
声明一个idCVar对象即声明了一个控制台变量,例如:
idCVar my_var("myval0");
但是想象一下,当我们在程序中多处使用一个变量的时候,若我们把我们
所要的数据塞到idCVar类里的话。那么就会出现歧义。也就是有可能出现同名
的变量在多个不同的地方被声明,并且值不同。idCVar类应用了Proxy(代理模式)
这种设计模式。idCVar并不直接持有变量的值。而他通过一个叫intenalVar的
成员变量,而该成员变量同样指向一个idCVar对象。访问idCVar变量的函数都
通过调用intenalVar的同名函数获得。也就是说真正持有数据的intenalVar所指向
的指针。而intenalVar在初始化后会被指向一个idInternalCVar的对象。该
idInternalCVar类继承自idCVar类。在初始化idCVar时会自动在idCVarSystemLocal
控制台变量系统中注册自己。若当前类没有被分配一个internalVar 该 idCVarSystemLocal
会为其分配一个。若看到声明该控制台变量的名称已经在系统中存在同名的internalVar
则让该变量指向这个已存在的idInternalCVar变量。并且尝试更改其值。这种
感觉有点类似于只能指针。你可以向以下方式声明变量:
在某个函数中:
void func1(){
...
idCVar("myval0" , "0" , CVAR_INTEGER , "my frsit val");
...
}
在另一个函数中:
void func2(){
...
idCVar("myval0" , "123" , CVAR_INTEGER , "my val");
...
}
在两处声明的同名控制台变量指向的是一个idInternalCVar对象!
原创粉丝点击