纯C模拟构造函数与析构函数

老邓 2009-04-18 05:03:29
我们知道,C语言可以使用struct来模拟class,网上也有不少这方面的资料。
可我的问题是:如何利用struct来模拟构造函数析构函数呢?
我现在有了一定的想法,并且准备实现它(虽然有缺陷)。
在我实现之前,想请教大家的思路!
请大家不吝指教,本人感谢在先!

先给50分,凡给出有价值的思路或实现,一律得分。
如回答踊跃,再往上加分。

另,“帮顶”“Up”之类的就免了吧。
希望通过大家的努力,找到一种最理想的解决方案!
...全文
3112 97 打赏 收藏 转发到动态 举报
写回复
用AI写文章
97 条回复
切换为时间正序
请发表友善的回复…
发表回复
老邓 2011-01-19
  • 打赏
  • 举报
回复
开源,目前最不满意的就是对父类中的方法的访问。
没有优雅的好办法!!
老邓 2011-01-19
  • 打赏
  • 举报
回复
工作需要,重新设计,思路和fx397993401提到的基本相同。
http://topic.csdn.net/u/20110118/11/592a89e0-1cb7-4ce3-b07b-c1607093ee7a.html
kylewangkylewang 2010-07-13
  • 打赏
  • 举报
回复
C和C++各有其特色,既然要用纯的C或C++,肯定有其缺陷和不足,不需要互相模仿...
gz_qmc 2010-05-26
  • 打赏
  • 举报
回复
我的看法,从malloc出发,类的构件涵数和析构涵数都是在分配类存最开使和最结束。
只要改写malloc和free判断分配的类型就可以触发相应的代码
别忘了,类是要在创建实例时才执行初始话的。
xiangjai 2010-04-17
  • 打赏
  • 举报
回复
强人,支持一下
aLosePig 2010-04-16
  • 打赏
  • 举报
回复
既然要模拟C++,就先反编译了解C++的对象模型。
其在内存中是如何布局的。可参考lisp(<<c++prime>>作者)
写的<<深入剖析C++对象模型>>
对于虚拟表,就用函数指针模拟。
对于自动调用构造函数,暂想不出什么好办法。
ujfj1986 2009-12-04
  • 打赏
  • 举报
回复
mark
moye111 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 morris88 的回复:]
意义何在?

[/Quote]
意义重大!
majlor 2009-06-28
  • 打赏
  • 举报
回复
mark
xbsf_137 2009-06-27
  • 打赏
  • 举报
回复
学习!
印第安爸爸 2009-06-27
  • 打赏
  • 举报
回复
mark
lingdushanke 2009-06-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mabo321 的回复:]
引用 6 楼 BobYy69 的回复:
纯C是不允许在struct中写函数的,在C++中里倒是可以

纯C定义对象是: struct Student obj;
C++中 可以这样: Student obj;
[/Quote]


可以用typedef定义新类型使c使用起来与c++更为接近

typedef struce Student
{
char name[10];
int age;
}
volcanol 2009-06-27
  • 打赏
  • 举报
回复
我是菜鸟 ,我说一句。 其实什么语言都可以实现面向对象, 如果各位有能力编写一个支持面向对象的编译器的话,那么就是很少人知道的易语言(中文)也可以实现C或C++的功能, 语言不是关键。 我的观点一直是 编译器才是语言的核心。有什么样的编译器就会有相应的语言或说编程思想。就像有不一样样的OS就会有不一样的文件系统一样。
volcanol 2009-06-27
  • 打赏
  • 举报
回复
mark
jianzhibeihang 2009-06-26
  • 打赏
  • 举报
回复
mark
qq0084 2009-06-26
  • 打赏
  • 举报
回复
学习
is__ing 2009-05-10
  • 打赏
  • 举报
回复
这个思路牛啊
老邓 2009-04-29
  • 打赏
  • 举报
回复
很遗憾,最近玩魔方玩疯了,所以没精力研究。
先结帖吧。
以后写出来了,再帖上来。
不过基本思路:只能走堆里new和delete,其实有点没意思了。
缺陷太明显。

所以下一步考虑如果用好C++里的C,从而提高效率!
Paradin 2009-04-26
  • 打赏
  • 举报
回复
学得不错。
老邓 2009-04-26
  • 打赏
  • 举报
回复
[Quote=引用 73 楼 icansaymyabc 的回复:]
&#nbsp;
[/Quote]
没明白啥意思。
最近忙着研究魔方,所以没时间把大家的思路综合起来。
而且有点犹豫是否选择MinGW编译器。
加载更多回复(73)
目 录 译者序 前言 第1章 对象的演化 1.1基本概念 1.1.1对象:特性十行为 1.1.2继承:类型关系 1.1.3多态性 1.1.4操作概念:OOP程序像什么 1.2为什么C++会成功 1.2.1较好的C 1.2.2采用渐进的学习方式 1.2.3运行效率 1.2.4系统更容易表达和理解 1.2.5“库”使你事半功倍 1.2.6错误处理 1.2.7大程序设计 1.3方法学介绍 1.3.1复杂性 1.3.2内部原则 1.3.3外部原则 1.3.4对象设计的五个阶段 1.3.5方法承诺什么 1.3.6方法应当提供什么 1.4起草:最小的方法 1.4.1前提 1.4.2高概念 1.4.3论述(treatment) 1.4.4结构化 1.4.5开发 1.4.6重写 1.4.7逻辑 1.5其他方法 1.5.1Booch 1.5.2责任驱动的设计(RDD) 1.5.3对象建模技术(OMT) 1.6为向OOP转变而采取的策略 1.6.1逐步进入OOP 1.6.2管理障碍 1.7小结 第2章 数据抽象 2.1声明与定义 2.2一个袖珍C库 2.3放在一起:项目创建工具 2.4什么是非正常 2.5基本对象 2.6什么是对象 2.7抽象数据类型 2.8对象细节 2.9头文件形式 2.10嵌套结构 2.11小结 2.12练习 第3章 隐藏实现 3.1设置限制 3.2C++的存取控制 3.3友元 3.3.1嵌套友元 3.3.2它是的吗 3.4对象布局 3.5类 3.5.1用存取控制来修改stash 3.5.2用存取控制来修改stack 3.6句柄类(handleclasses) 3.6.1可见的实现部分 3.6.2减少重复编译 3.7小结 3.8练习 第4章 初始化与清除 4.1用构造函数确保初始化 4.2用析构函数确保清除 4.3清除定义块 4.3.1for循环 4.3.2空间分配 4.4含有构造函数析构函数的stash 4.5含有构造函数析构函数的stack 4.6集合初始化 4.7缺省构造函数 4.8小结 4.9练习 第5章 函数重载与缺省参数 5.1范围分解 5.1.1用返回值重载 5.1.2安全类型连接 5.2重载的例子 5.3缺省参数 5.4小结 5.5练习 第6章 输入输出流介绍 6.1为什么要用输入输出流 6.2解决输入输出流问题 6.2.1预先了解操作符重载 6.2.2插入符与提取符 6.2.3通常用法 6.2.4面向行的输入 6.3文件输入输出流 6.4输入输出流缓冲 6.5在输入输出流中查找 6.6strstreams 6.6.1为用户分配的存储 6.6.2自动存储分配 6.7输出流格式化 6.7.1内部格式化数据 6.7.2例子 6.8格式化操纵算子 6.9建立操纵算子 6.10输入输出流实例 6.10.1代码生成 6.10.2一个简单的数据记录 6.11小结 6.12练习 第7章 常量 7.1值替代 7.1.1头文件里的const 7.1.2const的安全性 7.1.3集合 7.1.4与C语言的区别 7.2指针 7.2.1指向const的指针 7.2.2const指针 7.2.3赋值和类型检查 7.3函数参数和返回值 7.3.1传递const值 7.3.2返回const值 7.3.3传递和返回地址 7.4类 7.4.1类里的const和enum 7.4.2编译期间类里的常量 7.4.3const对象和成员函数 7.4.4只读存储能力 7.5可变的(volatile) 7.6小结 7.7练习 第8章 内联函数 8.1预处理器的缺陷 8.2内联函数 8.2.1类内部的内联函数 8.2.2存取函数 8.3内联函数和编译器 8.3.1局限性 8.3.2赋值顺序 8.3.3在构造函数析构函数里隐藏行为 8.4减少混乱 8.5预处理器的特点 8.6改进的错误检查 8.7小结 8.8练习 第9章 命名控制 9.1来自C语言中的静态成员 9.1.1函数内部的静态变量 9.1.2控制连接 9.1.3其他的存储类型指定符 9.2名字空间 9.2.1产生一个名字空间 9.2.2使用名字空间 9.3C++中的静态成员 9.3.1定义静态数据成员的存储 9.3.2嵌套类和局部类 9.3.3静态成员函数 9.4静态初始化的依赖因素 9.5转换连接指定 9.6小结 9.7练习 第10章 引用和拷贝构造函数 10.1C++中的指针 10.2C+十中的引用 10.2.1函数中的引用 10.2.2参数传递准则 10.3拷贝构造函数 10.3.1传值方式传递和返回 10.3.2拷贝构造函数 10.3.3缺省拷贝构造函数 10.3.4拷贝构造函数方法的选择 10.4指向成员的指针(简称成员指针) 10.5小结 10.6练习 第11章 运算符重载 1
NUDT程序设计模拟测试 1. 请创建一个数据类型为T的链表类模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该类模板的正确性: 1) 用List模板定义一个List类型的模板类对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List类型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8

69,373

社区成员

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

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