1.如果新类打算使用Nebula3对象模型扩展的特性如refcounting,RTTI等等,那么它必须继承Core::RefCounted类。
2.如果新类是一个典型很小的帮助类或工具类,像一个动态数组类,一个数学向量类,或者其它类似的。那么它从Core::RefCounted继承下来也没有什么意义。
继承Core::RefCounted的类会有一些限制:
1.继承Core::RefCounted的类不能直接在本地C++上下文创建栈对象,因为栈对象的生命周期是由C++管理的(当离开当前C++上下文它们将自动销毁,这样就完全绕开了Nebula3的引用计数生命周期管理)。
2.继承Core::RefCounted的类只有一个默认的构造函数。
3.继承Core::RefCounted的类必须有一个虚拟的析构函数。
4.继承Core::RefCounted的类必须不能拷贝,因为这样将搞乱引用计数机制。
为了使用Nebula3对象模型特性,首先是要继承Core::RefCounted类,其次是要在新类的声明和头部文件注释一些额外的信息:
一个标准继承Core::RefCounted类的声明看起来像这样:
namespace MyNamespace
{
class MyClass : public Core::RefCounted
{
DeclareClass(MyClass);
public:
/// constructor
MyClass();
/// destructor
virtual ~MyClass();
...
};
RegisterClass(MyClass);
注意DeclaredClass()宏,默认构造函数和虚拟析构函数和在类声明外的RegisterClass()宏。DeclareClass()宏为实现RTTI和工厂机制在类声明中增加了一点点Nebula3特性信息。从程序员的角度来看DeclareClass()宏通常是隐藏在Nebula3对象模型内部,因此,对象模型内部可以在不影响已存在类的情况下被改变。RegisterClass()宏是可选的,它注册类到中心工厂对象。如果你知道类对象将永远不会通过字符串类名或fourcc代码创建,那么RegisterClass()宏可以被忽略。
在类的.cc文件中需要包含以下Nebula3特殊信息:
namespace MyNamespace
{
ImplementClass(MyNamespace::MyClass, 'MYCL', Core::RefCounted);
}
ImplementClass()宏注册了类的RTTI机制,第一个参数是C++类名(注意,类名必须包含命名空间)。第二个参数是的类的fourcc代码,fourcc代码在所有类中必须是唯一的(在程序启动时如果有2个类注册了相同的fourcc代码将会产生一个运行时错误)。第三个参数是父类的名称。这个被RTTI机制用来重建类树。
(说明:在N3的最新版本中DeclareClass改为__DeclareClass,ImplementClass改为__ImplementClasClass改为__RegisterClass)
原文:
[声明]:限于译者水平,文中难免错漏之处,欢迎各位网友批评指正;
没有评论:
发表评论