json2jsoncpp 关键代码分析2

上一篇已经讲了j2jc实现从json数据直接生成对象的基本原来,本篇将继续分析是如何做到的

如果你有执行看用j参数生成的头文件你会发现,里面所有的类都是继承与一个叫json2jsoncpp的类的

class rpc1:public json2jsoncpp
{
private:
    virtual bool decodesuccess(){return true;}

    static string2object * NEW()
    {
        return new rpc1;
    }

public:
    static bool REG(newobjfun fun=0)
    {
        if(fun)return string2object::REG("rpc1",fun);
        else return string2object::REG("rpc1",NEW);
    }

    static bool UNREG()
    {
        return string2object::UNREG("rpc1");
    }
    //...
}

 

这个类就来至json2jsoncpp.h

然后看json2jsoncpp.h

其实这个json2jsoncpp也是继承与string2object的

class json2jsoncpp:public string2object
{
public:

    template<typename NEWCLSX>
    static string2object * NEW()
    {
        return new NEWCLSX;
    }

    template<typename REGCLSX>
    static bool REG()
    {

        return REGCLSX::REG( NEW<REGCLSX> );
    }

    template<typename UNREGCLSX>
    static bool UNREG()
    {
        return UNREGCLSX::UNREG();
    }
    //...

}

 

注册代码:

class G1:public rpc1
{
    //...
}




////////////////////////////

//注册G1
json2jsoncpp::REG<G1>();

G1是继承rpc1的,所以自然有了rpc1的所有内容,包括

static bool REG(newobjfun fun=0)
    {
        if(fun)return string2object::REG("rpc1",fun);
        else return string2object::REG("rpc1",NEW);
    }

 

主要关注return string2object::REG("rpc1",fun); 这一行,她就是向string2object注册名字和new函数

但是fun从哪来呢?

看代码return REGCLSX::REG( NEW<REGCLSX> );

REGCLSX就是G1

那就是掉用G1::REG( x )  (其实就是调用rpc1::REG)

x就是那个fun了

再看NEW<REGCLSX> 实际上就是:

static string2object * NEW() { return new G1; }

这个new 函数了

 

所以自然把字符串“rpc1” 和  static string2object * NEW() { return new G1; }  关联了起来

 

后面的事情就好办多了

先写到这里,大家先消化消化

 

posted @ 2013-03-01 21:37  卡卡的Blog  阅读(218)  评论(0编辑  收藏  举报