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
  • 相关阅读:
    深度学习学习总结
    线性回归学习总结
    机器学习常用算法总结
    2020年,给自己立个flag
    与博客添网易云外钟墯之坑
    给博客添加网易云外链时掉的坑
    BEGINNING
    【华为云技术分享】程序员真香定律:源码即设计
    【华为云技术分享】【DevCloud · 敏捷智库】如何利用核心概念解决估算常见问题
    差点被祭天!狂欢618,且看研发人如何绝地求生
  • 原文地址:https://www.cnblogs.com/vanis/p/2939456.html
Copyright © 2011-2022 走看看