zoukankan      html  css  js  c++  java
  • 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; }  关联了起来

    后面的事情就好办多了

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

     

    本篇博客为原创作品,个人转载或引用时请保留本人的署名及博客网址,商业转载请事先联系。我的博客地址是:http://www.cnblogs.com/vanis/ , 我的hotmail.com邮箱是vanishs
  • 相关阅读:
    js组件之间的通信
    localStorage, localforage, web sql三者的比较
    最近的学习计划
    无状态的web应用
    转 :meta name的含义:<META http-equiv=Content-Type content="text/html; charset=gb2312">
    css清除浮动的方法汇总
    segfault at 7fff6d99febc ip 0000003688644323 sp 00007fff6d99fd30 error 7 in libc.so.6[3688600000+175000]
    Linux内核定时器
    TCPIP网络协议层对应的RFC文档
    UIDocumentPickerViewController使用
  • 原文地址:https://www.cnblogs.com/vanis/p/2939456.html
Copyright © 2011-2022 走看看