游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3710|回复: 5

InterfaceReg链表是如何创建的?

[复制链接]

12

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2003-10-22 16:33:00 | 显示全部楼层 |阅读模式
InterfaceReg链表用于CreateInterface()返回特定的接口。
但是InterfaceReg是如何初始化的?

看来起作用的只有EXPOSE_INTERFACE
#define EXPOSE_INTERFACE(className, interfaceName, versionName) \
        static void* __Create##className##_interface() {return (interfaceName *)new className;}\
        static InterfaceReg __g_Create##className##_reg(__Create##className##_interface, versionName );

如果我写一句:
EXPOSE_INTERFACE(CMyClass, IMyClass, "MyName");

应该宏扩展成:
static void* __CreateCMyClass_interface()
{
 return (IMyClass *) new CMyClass;
}
static InterfaceReg __g_CreateCMyClass_reg(__CreateCMyClass_interface, "MyName" );;

这样有什么用?
InterfaceReg是否因此添加了一项
{"MyName", __CreateCMyClass_interface}?
难道末尾的双分号不会出错?
第二个static语句定义了什么东西?

12

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 2003-10-22 16:46:00 | 显示全部楼层

Re:InterfaceReg链表是如何创建的?

static InterfaceReg __g_CreateCMyClass_reg(__CreateCMyClass_interface, "MyName" );;

定义了一个InterfaceReg变量__g_CreateCMyClass_reg,
构造函数就将自己添加入链表。

12

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 2003-10-22 16:58:00 | 显示全部楼层

Re:InterfaceReg链表是如何创建的?

// A single class can support multiple interfaces through multiple inheritance

But we can not do this in a file:
class CMy: public IOne, public ITwo
{
 ...
}
EXPOSE_INTERFACE(CMy, IOne, "One");
EXPOSE_INTERFACE(CMy, ITwo, "Two");


18

主题

92

帖子

122

积分

注册会员

Rank: 2

积分
122
发表于 2003-10-22 18:04:00 | 显示全部楼层

Re:InterfaceReg链表是如何创建的?

楼主分析不错

我贴点代码大家看看:

总的来就是一个InterfaceReg类(结构)的单向链表

s_pInterfaceReg是表头,一开始初始化为NULL,做为空表标识
然后每个InterfaceReg类实例在构造时,设置m_pNext = s_pInterfaceRegs(指向前一个InterfaceReg类实例
),再重置表头
s_pInterfaceRegr指向当前的InterfaceReg类实例

InterfaceReg::InterfaceReg( InstantiateInterfaceFn fn, const char *pName ) :
        m_pName(pName)
{
        m_CreateFn = fn; //保存接口指针
        m_pNext = s_pInterfaceRegs;
        s_pInterfaceRegs = this;
}


void* CreateInterface( const char *pName, int *pReturnCode )
{
        InterfaceReg *pCur;
       
                 //遍历链表
        for(pCur=InterfaceReg::s_pInterfaceRegs; pCur; pCur=pCur->m_pNext)
        {
                if(strcmp(pCur->m_pName, pName) == 0)
                {
                        if ( pReturnCode )
                        {
                                *pReturnCode = IFACE_OK;
                        }
                        return pCur->m_CreateFn(); //找到则返回注册的接口指针
                }
        }
       
        if ( pReturnCode )
        {
                *pReturnCode = IFACE_FAILED;
        }
        return NULL;       
}

23

主题

53

帖子

53

积分

注册会员

Rank: 2

积分
53
发表于 2003-10-22 18:28:00 | 显示全部楼层

Re:InterfaceReg链表是如何创建的?

所有的InterfaceReg类都声明为静态的,那么那静态的类是在什么时候初始化的呢,也就是什么时候加入链表?是程序载入的时候吗?

18

主题

92

帖子

122

积分

注册会员

Rank: 2

积分
122
发表于 2003-10-23 09:25:00 | 显示全部楼层

Re: Re:InterfaceReg链表是如何创建的?

bentry: Re:InterfaceReg链表是如何创建的?

所有的InterfaceReg类都声明为静态的,那么那静态的类是在什么时候初始化的呢,也就是什么时候加入链表?是程序载入的时候吗?


是模块载入时,windows就是dll,linux是so
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-7 13:17

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表