核心子系统
核心库(Core namespace)实现了这些特性:
- 一个实现了引用计数的RefCounted基类
- 一个运行时类型信息系统(RTTI)
- 一个模板智能指针, 用于处理RefCounted对象的生命周期
- 一个由类名创建C++对象实例的工厂机制
- 一个中央Server对象用于建立基本的Nebula3运行环境
对象模型
Nebula3在C++对象模型的基础之上实现了下面这些新特性:
- 基于引用计数和智能指针的生命周期管理
- 基于类名或四字符编码的对象创建
- 一个运行时类型信息系统
实现一个新的Nebula3类
当实现一个新的类时首先要考虑它是一个传统的C++类还是要从
Core::RefCounted继承. 以下几点可以帮你找到答案:
- 如果这个类需要使用Nebula3的扩展对象特性, 如引用计数, RTTI等, 则它必须从Core::RefCounted继承.
- 如果这个类是一个典型的小工具类, 如动态数组, 数学向量, 或其它相似的东西, 那么它从Core::RefCounted 继承也没有什么意义.
从
Core::RefCounted类继承有一些限制:
- RefCounted派生类不应该在栈上创建对象, 因为栈对象的生命周期是由C++来管理的(他们会在离开当前上下文时被销毁, 从而绕过了Nebula3的引用计数生命周期 管理)
- RefCounted的派生类只有一个默认的构造函数.
- RefCounted的派生类必须有一个虚析构函数.
- RefCounted的派生类不能进行拷贝, 因为这样会造成引用计数机制混乱.
要使用Nebula3的对象模型特性, 除了需要从
Core::RefCounted继承外, 还需要在头文件新类的声明中进行额外的标注:
一个标准的
RefCounted派生类一般这样声明:
1:
namespace MyNamespace
2:
{
3:
class
MyClass : public Core::RefCounted
4:
{
5:
DeclareClass(MyClass);
6:
public
:
7:
/// constructor
8:
MyClass();
9:
/// destructor
10:
virtual ~MyClass();
11:
...
12:
};
13:
RegisterClass
(
MyClass);
|
注意
DeclareClass()宏, 构造函数, 析构函数还有类外面的
RegisterClass()宏.
DeclareClass()宏加入了RTTI和工厂机制所需的最小代价的信息, 它隐藏了Nebula3的对象模型, 希望可以在不影响已有类的基础进上进行内部机制的变更.
RegisterClass()宏是可选的, 它把当前类在中央工厂进行注册. 如果你知道这个类永远不会由类名或四字符编码进行创建, 这个宏可以省略.
在这个类的.cpp文件里需要包含Nebula3特有的信息:
1:
namespace MyNamespace
2:
{
3:
ImplementClass
(
MyNamespace::MyClass, 'MYCL', Co
|