Nebula2探秘03-Object System研究

2024-01-18 02:08

本文主要是介绍Nebula2探秘03-Object System研究,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Nebula2探秘03-Object System研究

happykevins文

 首先要创建一个Nebula2符合ObjectSystem规范的类,下面代码创建了一个最简单的Nebula2类:

 

/* ************************************************************************** */
/*     Nebula2 - Tutorial 03                                                     */
/*   ObjectSystem探秘                                                         */
/*     实现了一个最简单的Nebula2对象                                             */
/*   author: happykevins                                                         */
/* ************************************************************************** */
#pragma  once

#include 
" kernel/nkernelserver.h "
#include 
" kernel/nroot.h "

///  Nebula对象的父类名(用于建立RTTI关联)
extern   const   char *  SuperClassName;
///  Nebula对象的类名
extern   const   char *  ThisClassName;
///  Nebula对象的初始化操作
extern   bool   init_nebulaobj(nClass *  clazz, nKernelServer *  kernelServer);
///  Nebula对象的创建操作
extern   void *  new_nebulaobj();

/// ----------------------------------------------------------------------------
///  +NebulaObj
///  @note:
///     1.    Nebula2对象必须继承自Root类,因为整个NOH管理系统都是基于nroot的
///     2.    调用KernelServer的AddModule添加Nebula对象;需要为AddModule提供以下两个函数指针:
///         a.    bool (n_init_obj*)(nClass, nKernelServer)
///             提供向KernelServer注册该对象的操作
///         b.    void* (n_new_obj*)():
///             提供创建该对象实例的操作
///     3.    需要说明一点:Nebula对象是在调用AddModule时添加到类型列表的,而AddClass方法只是
///         建立了Class的层次关系,为Nebula的RTTI系统(将在后面的章节说明)提供支持。
///         而n_init_obj函数的主要工作就是建立RTTI的系统关联。
///  4.    为了编码简单,Nebula2提供了nNebulaUsePackage,nNebulaClass,nNebulaScriptClass等宏
///         来替代手工添加Nebula类型的工作
class  NebulaObj :  public  nRoot
{
public :
    
//  constructor
    NebulaObj()
    {
        nKernelServer::Instance()
-> Print( " [NebulaObj]Construct! " );
    }
    
//  destructor
     ~ NebulaObj()
    {
        nKernelServer::Instance()
-> Print( " [NebulaObj]Destruct! " );
    }
    
//  do something
     void  DoSomething( const   char *  msg)
    {
        nKernelServer::Instance()
-> Print( " [NebulaObj]%s " , msg);
    }
};
///  +NebulaObj
/// ----------------------------------------------------------------------------
/* ************************************************************************** */
/*     Nebula2 - Tutorial 03                                                     */
/*   ObjectSystem探秘                                                         */
/*     实现了一个最简单的Nebula2对象                                             */
/*   author: happykevins                                                         */
/* ************************************************************************** */
#include 
" NebulaObj.h "

const   char *  SuperClassName  =   " nroot " ;
const   char *  ThisClassName  =   " tutorialobj " ;

///  Nebula对象的初始化操作
bool  init_nebulaobj(nClass *  clazz, nKernelServer *  kernelServer)
{
    
//  设置类名
    clazz -> SetProperName(ThisClassName);
    
//  设置类大小
    clazz -> SetInstanceSize( sizeof (NebulaObj));
    
//  让KernelServer来建立RTTI关联
    kernelServer -> AddClass(SuperClassName, clazz);
    
return   true ;
}

///  Nebula对象的创建操作
void *  new_nebulaobj()
{
    
return  n_new(NebulaObj);
}

下面是将Nebula2Obj添加到KernelServer,并在NOH中创建该对象的代码:

 

/* ************************************************************************** */
/*     Nebula2 - Tutorial 03                                                     */
/*   ObjectSystem探秘                                                         */
/*   author: happykevins                                                         */
/* ************************************************************************** */

/// ----------------------------------------------------------------------------
///  +链接库
#pragma  comment(lib, "wsock32.lib")
#pragma  comment(lib, "d_nkernel.lib")
///  -链接库
/// ----------------------------------------------------------------------------

/// ----------------------------------------------------------------------------
///  +必要头文件
#include  " kernel/nkernelserver.h "
#include 
" util/nstack.h "
#include 
" util/nhashlist.h "
///  -必要头文件
/// ----------------------------------------------------------------------------

/// ----------------------------------------------------------------------------
///  +Tutorial的头文件
#include  " NebulaObj.h "
///  -Tutorial的头文件
/// ----------------------------------------------------------------------------

//  Kernel Server
nKernelServer *  ks  =  NULL;

/// ----------------------------------------------------------------------------
///  +打印当前NOH树
void  PrintNOH(nRoot *  pRoot)
{
    
//  内核加锁
    ks -> Lock();

    
//  层次栈
    
//  在开始时将根节点入栈
    nStack < nRoot *>  deepStack;
    deepStack.Push(pRoot);
    
    
//  遍历树
     do  
    {
        
//  获得当前栈顶元素
        nRoot *  obj  =  deepStack.Pop();

        
//  打印该元素NOH名
         if  ( obj -> GetParent() )
        {
            ks
-> Print( " %s " , obj -> GetFullName().Get());
        }
        
else
        {
            ks
-> Print( " %s " , obj -> GetName());
        }
        
        
//  兄弟节点入栈
         if  ( obj -> IsLinked()  &&  obj -> GetSucc() )
        {
            deepStack.Push(obj
-> GetSucc());
        }

        
//  第一个子节点入栈
         if  ( obj -> GetHead() )
        {
            deepStack.Push(obj
-> GetHead());
        }

    } 
while ( ! deepStack.IsEmpty());

    
//  内核解锁
    ks -> Unlock();
}
///  -打印当前NOH树
/// ----------------------------------------------------------------------------

/// ----------------------------------------------------------------------------
///     +打印当前Class列表
void  PrintClasses()
{
    
//  内核加锁
    ks -> Lock();
    
    
//  获得Class列表
     const  nHashList *  classList  =  ks -> GetClassList();
    nHashNode
*  node  =  (nClass * )classList -> GetHead();
    
    
//  遍历输出Class列表
     do
    {
        nClass
*  cls  =  (nClass * )node;
        ks
-> Print( " %s " , cls -> GetName());
        node 
=  node -> GetSucc();
    } 
while  ( node );

    
//  内核解锁
    ks -> Unlock();
}
///     -打印当前Class列表
/// ----------------------------------------------------------------------------

/// ----------------------------------------------------------------------------
///     +在Kernel中创建一个类
void  CreateClass()
{
    ks
-> AddModule(ThisClassName, init_nebulaobj, new_nebulaobj);
}
///     -在Kernel中创建一个类
/// ----------------------------------------------------------------------------

/// ----------------------------------------------------------------------------
///     +创建类的实例
void  CreateInstance()
{
    
///  我们要创建对象的指针
    NebulaObj *  obj  =  NULL;

    
///  创建实例但不添加到NOH树中
    obj  =  (NebulaObj * )ks -> New(ThisClassName);
    obj
-> DoSomething( " Create Instance not in NOH! " );
    
///  销毁对象
    obj -> Release();
    obj 
=  NULL;

    
///  创建实例并添加到NOH中
    
///  在NOH树中的对象将在KernelServer关闭时自动被销毁
    obj  =  (NebulaObj * )ks -> New(ThisClassName,  " /Tutorial/TutorialObj " );
    obj
-> DoSomething( " Create Instance in NOH! " );

    
///  从NOH中查询对象
    obj  =  (NebulaObj * )ks -> Lookup( " /Tutorial/TutorialObj " );
    obj
-> DoSomething( " Lookup me in NOH! " );
}
///     -创建类的实例
/// ----------------------------------------------------------------------------

/// ----------------------------------------------------------------------------
///  +Application
int  main( int  argc,  const   char **  argv)
{
    
///  创建KernelServer
    ks  =  n_new(nKernelServer);

    
///  打印Class列表
    ks -> Print( " *****Pure Class List***** " );
    PrintClasses();

    
///  打印NOH: "/"是NOH根的名称
    ks -> Print( " *****Pure NOH Tree***** " );
    PrintNOH(ks
-> Lookup( " / " ));

    
///  在Kernel中创建一个类
    CreateClass();

    
///  打印Class列表
    ks -> Print( " *****Class List After Create Class: %s***** " , ThisClassName);
    PrintClasses();

    
///  创建类的实例
    ks -> Print( " *****Create Instance Test***** " );
    CreateInstance();

    
///  打印NOH: "/"是NOH根的名称
    ks -> Print( " *****NOH Tree After Create Instance***** " );
    PrintNOH(ks
-> Lookup( " / " ));

    
///  销毁KernelServer
    ks -> Print( " *****Closing KernelServer Here!***** " );
    n_delete(ks);

    getchar();
    
return   0 ;
}
///  -Application
/// ----------------------------------------------------------------------------



这篇关于Nebula2探秘03-Object System研究的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/617813

相关文章

Java中Object类的常用方法小结

《Java中Object类的常用方法小结》JavaObject类是所有类的父类,位于java.lang包中,本文为大家整理了一些Object类的常用方法,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. public boolean equals(Object obj)2. public int ha

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

深入探讨Java 中的 Object 类详解(一切类的根基)

《深入探讨Java中的Object类详解(一切类的根基)》本文详细介绍了Java中的Object类,作为所有类的根类,其重要性不言而喻,文章涵盖了Object类的主要方法,如toString()... 目录1. Object 类的基本概念1.1 Object 类的定义2. Object 类的主要方法3. O

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

Partical System

创建"粒子系统物体"(点击菜单GameObject -> Create Other -> Particle System) 添加"粒子系统组件"(点击Component -> Effects  ->Particle System) 粒子系统检视面板  点击粒子系统检视面板的右上角的"+"来增加新的模块。(Show All Modules:显示全部) 初始化模块: •

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

生信圆桌x生信分析平台:助力生物信息学研究的综合工具

介绍 少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 生物信息学的迅速发展催生了众多生信分析平台,这些平台通过集成各种生物信息学工具和算法,极大地简化了数据处理和分析流程,使研究人员能够更高效地从海量生物数据中提取有价值的信息。这些平台通常具备友好的用户界面和强大的计算能力,支持不同类型的生物数据分析,如基因组、转录组、蛋白质组等。

开题报告中的研究方法设计:AI能帮你做什么?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 大家都准备开题报告了吗?研究方法部分是不是已经让你头疼到抓狂? 别急,这可是大多数人都会遇到的难题!尤其是研究方法设计这一块,选定性还是定量,怎么搞才能符合老师的要求? 每次到这儿,头脑一片空白。 好消息是,现在AI工具火得一塌糊涂,比如ChatGPT,居然能帮你在研究方法这块儿上出点主意。是不

研究人员在RSA大会上演示利用恶意JPEG图片入侵企业内网

安全研究人员Marcus Murray在正在旧金山举行的RSA大会上公布了一种利用恶意JPEG图片入侵企业网络内部Windows服务器的新方法。  攻击流程及漏洞分析 最近,安全专家兼渗透测试员Marcus Murray发现了一种利用恶意JPEG图片来攻击Windows服务器的新方法,利用该方法还可以在目标网络中进行特权提升。几天前,在旧金山举行的RSA大会上,该Marcus现场展示了攻击流程,