分享C语言面向对象开发之类C++实现

老邓 2011-01-18 11:33:49
经参考网上实现,本人维护了一个C语言面向对象的类C++实现,BSD协议+无任何版权、个人说明。
但还没有完成,请大家多提改进意见http://www.gitorious.org/oopc

这是其中的demo_01的代码,完整代码请自己下载。
另外,这几天会不断的完善demo,欢迎加盟!
#include <stdio.h>
#include <stdlib.h>
#include "oopc.h"

CLASS(HelloWorld)
{
OOPC;
bool (*test)(bool b);
};

static bool test(bool b)
{
b ? printf("Hello World!\n") : printf("Hello China!\n");
return !b;
}

CTOR(HelloWorld)
{
printf("ctor\n");
BIND(test);
}

DTOR(HelloWorld)
{
UNUSED(self);
printf("dtor\n");
}

int main()
{
HelloWorld *p = new(HelloWorld);
p->test(!false);
delete(p);
return 0;
}

请大家多提改进意见,多谢!!
...全文
1233 97 打赏 收藏 转发到动态 举报
写回复
用AI写文章
97 条回复
切换为时间正序
请发表友善的回复…
发表回复
sun2003shy 2011-03-10
  • 打赏
  • 举报
回复
菜了,当我没问吧。。
sun2003shy 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 63 楼 loaden 的回复:]

这是今天新增的宏,用于信息隐藏:成员变量不会暴露在接口处。
C/C++ code
// Information hiding for member variables
#define MEMBER_DECL(selfClass) \
struct ……
[/Quote]
这个在VC上编译不过吧,貌似VC不支持结构体在头文件声明,c文件定义。
老邓 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 88 楼 loaden 的回复:]

一个Vector封装的思路:
#define DECL_VECTOR(x, y) CLASS (Vector##x) { ... }
#define IMPL_VECTOR(x, y) static void func(....

在头文件中完成上面两个宏。
在使用的地方实例化:
DECL_VECTOR(Int, int);
DECL_VECTOR(Float, float);
……
[/Quote]
基于这个想法实现了一个单向链表,最简单的那种,目前只适用于内置类型。
对类指针的指针还没有好的比较通用的想法。
http://topic.csdn.net/u/20110223/18/568e22d6-979c-43ed-9bba-aabf838554c4.html
herman~~ 2011-02-24
  • 打赏
  • 举报
回复
呵呵,UP一个,水平太菜,看不懂
renzhewh 2011-02-24
  • 打赏
  • 举报
回复
其实个人觉得写个支持 oo 的中间语言,利用 lex、yacc 之类的工具将其转换为 C,岂不更方便
xiangchendub 2011-01-31
  • 打赏
  • 举报
回复
还是支持老邓一下。
老邓 2011-01-31
  • 打赏
  • 举报
回复
一个Vector封装的思路:
#define DECL_VECTOR(x, y) CLASS (Vector##x) { ... }
#define IMPL_VECTOR(x, y) static void func(....

在头文件中完成上面两个宏。
在使用的地方实例化:
DECL_VECTOR(Int, int);
DECL_VECTOR(Float, float);
DECL_VECTOR(Double, double);
DECL_VECTOR(Char, char);
DECL_VECTOR(VoidPtr, void *);
...
老邓 2011-01-31
  • 打赏
  • 举报
回复
本想做一个比较通用的Vector封装的,可是近期实在是太忙了。
先添加CMake工程,毕竟不是谁都玩QtCreator。
相对来讲,玩cmake可能更通用些。
cmake用来管理跨平台工程也是很爽嘀。
目前所有的例子模板都基于:
project(demo_01)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
set(CMAKE_BUILD_TYPE Debug)
include_directories(..)
add_executable(demo_01 ${SRC_LIST})

只需要改工程名和生成的可执行文件名即可。
iComputerLion 2011-01-31
  • 打赏
  • 举报
回复
如果不从编译器着手的话,建议来一个空间管理器
mstlq 2011-01-31
  • 打赏
  • 举报
回复
老邓真能折腾……
支持^_^
断问天 2011-01-31
  • 打赏
  • 举报
回复
LZ是能静下心做实事的人,我这里也有一套面向对象的C实现,不过是别人的。每天都在用,也没认真研究过。我决定好好研究下,也对比下LZ 的代码。
budongC 2011-01-30
  • 打赏
  • 举报
回复
cplusplus_tmp 2011-01-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 forestdb 的回复:]

LZ果然精力好好啊,羡慕。
[/Quote]
:DDDDDDDDDD
pang123hui 2011-01-28
  • 打赏
  • 举报
回复
我个人觉得要么彻底的面相对象,要么就面向过程

恐怕C++最终还是一个悲剧

不过我只是一个学生,懂点皮毛不敢多言

总之支持LZ吧,我有时间好好看看LZ的代码
pang123hui 2011-01-28
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 loaden 的回复:]
修正Crash,增加多重继承示例:demo_05

C/C++ code
#include <stdio.h>
#include <stdlib.h>
#include "oopc.h"

CLASS(Father)
{
void (*fatherSay)(const char *s);
int _father;
};

static void fathe……
[/Quote]

晕,多重继承还来,恩,不过支持LZ,不多说
老邓 2011-01-28
  • 打赏
  • 举报
回复
写C++代码是一种享受!!
看C++代码跟看围棋棋形一样,是一种美。
skyworth98 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 taodm 的回复:]
其实实在没必要。

C也可以直接就写得很清楚,而模拟C++一般更容易让代码无法继续维护。
[/Quote]
sp。
c++是一个定位很尴尬的语言,面向对象的程度不如c#,java;
简洁程度不如c。

编译器在后面做了太多事情,但是呢,活也没干利索。
然后呢,就是一群半吊子程序员程序员不知道出于什么目的,用那些所谓的feature实现一个个“强大”的功能。最后就弄成了一个四不像。

见过一个NB的哥们,为了实现一个一次性的加密功能,不知道从哪儿抄了一段C代码,然后用C++实现了一个基类,然后呢,在子类中实现具体的算法。初一看,不错啊,很有面向对象思想啊其实呢,结果呢内存泄漏就是这么来的……析构函数居然不是虚的……

无意挑起语言之争,就事论事。
感觉现在好多人就是在用更复杂的解决方案来解决某个本来不是很复杂的复杂问题。
ls251544415 2011-01-27
  • 打赏
  • 举报
回复
好奇妙的想法
a707000646 2011-01-27
  • 打赏
  • 举报
回复
后贴先收下了
本人是来学习的
老邓 2011-01-27
  • 打赏
  • 举报
回复
模拟单件类:
ABS_CLASS(Global)
{
...
} _global;

然后在main函数处调用其构造与析构函数即可:
static __attribute((constructor)) void appConstructor()
{
ctorGlobal(&_global);
}

static __attribute((destructor)) void appDestructor()
{
dtorGlobal(&_global);
}


近期用C开发,脑袋里想的全是C++的东西。
通过本次模拟,发现这套库还是非常好用的!
很好的达到了封装与信息隐藏的作用。

单件类要访问成员函数,应该把M宏重写一下:
#undef M
#define M (*_global._memberVariable)
加载更多回复(63)

69,376

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧