zoukankan      html  css  js  c++  java
  • c语言来实现c++

    闲来没事,看了看sqlite的源代码,突然想用c实现c++,写了例如以下demo,自我感觉不错

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Class;
    typedef struct Class _Class;
    
    struct IMethod
    {
    	void (*ctor)(_Class *c);
    	void (*dtor)(_Class *c);
    	int (*sum)(_Class* c);
    	int (*getValueA)(_Class* c);
    	int (*getValueB)(_Class* c);
    	void (*setValueA)(_Class*c, int a);
    	void (*setValueB)(_Class *c, int b);
    };
    typedef struct IMethod _IMethod;
    
    typedef struct Class
    {
    	//数据
    	int m_a;
    	int m_b;
    
    	//接口
    	_IMethod m_method;
    } _Class;
    
    int _sum(_Class *c)
    {
    	return c->m_a+c->m_b;
    }
    
    int _getValueA(_Class *c)
    {
    	return c->m_a;
    }
    
    int _getValueB(_Class *c)
    {
    	return c->m_b;
    }
    
    void _setValueA(_Class *c, int a)
    {
    	c->m_a = a;
    }
    
    void _setValueB(_Class *c, int b)
    {
    	c->m_b = b;
    }
    
    void _ctor(_Class *c)
    {
    	printf("create new _Class
    ");
    
    	//初始化数据,构造函数
    	c->m_method.sum = &_sum;
    	c->m_method.getValueA = &_getValueA;
    	c->m_method.getValueB = &_getValueB;
    	c->m_method.setValueA = &_setValueA;
    	c->m_method.setValueB = &_setValueB;
    
    	c->m_a = 0;
    	c->m_b = 0;
    }
    
    void _dtor(_Class *c)
    {
    	printf("delete _Class
    ");
    
    	//析构函数
    }
    
    //_Class的对象工厂
    _Class *newClass()
    {
    	_Class* obj= (_Class*)malloc(sizeof(_Class));
    	_ctor(obj);
    	return obj;
    }
    
    void deleteClass(_Class * c)
    {
    	_dtor(c);
    	free(c);
    }
    
    #define CXX_CALLER(obj, fun,...)
    	obj->m_method.fun(obj, __VA_ARGS__);
    
    
    int main(int argc, char *argv[])
    {
    	_Class *c = newClass();
    
    	int a=0, b=0, sum=0;
    	CXX_CALLER(c, setValueA, 100);
    	CXX_CALLER(c, setValueB, 200);
    // 	c->m_method.setValueA(100);
    // 	c->m_method.setValueB(200);
    
    // 	a = c->m_method.getValueA(c);
    // 	b = c->m_method.getValueB(c);
    // 	sum = c->m_method.sum(c);
    	a = CXX_CALLER(c, getValueA);
    	b = CXX_CALLER(c, getValueB);
    	sum = CXX_CALLER(c, sum);
    
    	printf("a=%d, b=%d, sum=%d
    ", a, b, sum);
    
    	deleteClass(c);
    
    	getchar();
    	return 0;
    }
    


  • 相关阅读:
    struts2自定义拦截器之过滤不良言论---http500可能的问题所在
    bzoj4205[FJ2015集训] 卡牌配对
    bzoj1562[NOI2009] 变换序列
    bzoj1433[ZJOI2009] 假期的宿舍
    bzoj2150 部落战争
    从bzoj2463到bzoj1443和bzoj2437 博弈+二分图匹配
    bzoj4554[Tjoi2016&Heoi2016] 游戏
    bzoj1059[ZJOI2007] 矩阵游戏
    bzoj1143[CTSC2008] 祭祀river
    bzoj3175[Tjoi2013] 攻击装置
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4009479.html
Copyright © 2011-2022 走看看