新手求问,用C如何实现面向对象?

代码裁缝codetailor 2011-05-25 03:27:21
关于OOC(面向对象C编程),
看了一些别人的文章,有一点是确定的,就是利用C的结构体,来实现Java或者C++中类的功能,
但是如何用一个定义好的结构体,方便的创建出多个实例,以及随时赋值、传值?
-
比如目前要实现一个二叉树,用Java可以每次new一个节点,插入现有的树中,
在C中,如何实现?
据我目前了解,结构体赋值有很多限制,好像只可以在定义的时候赋值?
那我定义一个结构体,只能定义的同时赋值一次?
而我目前想做的是,定义一个结构体(比如树节点node),
用这个结构体(struct node)创建几十几百个实例出来,然后形成一棵树?
请问在C中怎么做?
-
我是C新手,Java用惯了,如果问题幼稚请包涵,谢谢!
...全文
1544 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdfiyuejin 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 robotech001 的回复:]

这个阿

简单,

.h里面

构造函数(结构 实例)
析构函数(结构 实例)
结构
{
函数指针1;
函数指针2;
......
函数指针3;
}


.cpp文件
定义隐藏的细节.
[/Quote]
额,点出了公用和私有
Joson.e8love 2011-05-30
  • 打赏
  • 举报
回复
C 也能面向对象 不知道咋弄
Robotech001 2011-05-30
  • 打赏
  • 举报
回复
这个阿

简单,

.h里面

构造函数(结构 实例)
析构函数(结构 实例)
结构
{
函数指针1;
函数指针2;
......
函数指针3;
}


.cpp文件
定义隐藏的细节.
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 robotech001 的回复:]

这个阿

简单,

.h里面

构造函数(结构 实例)
析构函数(结构 实例)
结构
{
函数指针1;
函数指针2;
......
函数指针3;
}


.cpp文件
定义隐藏的细节.
[/Quote]

.cpp ? 应该是 .c 才对吧,
你是不是用VC,不能创建.c文件?建议不要用VC开发纯C的项目,
另外你能说的具体点不,给个例子最好~
airsethh 2011-05-29
  • 打赏
  • 举报
回复
学习学习!
onbak 2011-05-29
  • 打赏
  • 举报
回复
我认为,目前 OIOIC 是用C面向对象最成功的,比C++还好。
  • 打赏
  • 举报
回复
面向对象是一种思想,目的是合理的组织和封装代码,
具有更高的可读性,何来的丑陋?
就算用OO的思路写出的C代码也不等于C++,而且也没有必要去模仿C++或者Java,
有本OOC的书,建议你去看下
duke3030 2011-05-28
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 carr123 的回复:]
当你用C处心积虑地去面向对象,写出一堆丑陋的代码时,是否想过,C++正是替你做了这事啊,而且做得很好,没有牺牲代码效率。
[/Quote]

很多场合是没法使用C++的啊
carr123 2011-05-27
  • 打赏
  • 举报
回复
当你用C处心积虑地去面向对象,写出一堆丑陋的代码时,是否想过,C++正是替你做了这事啊,而且做得很好,没有牺牲代码效率。
tanyufeng_521 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 adlay 的回复:]
C/C++ code

#include <stdlib.h>
#include <string>

struct node
{
long hashcode;
char *data;
struct node *left;
struct node *right;
};

void node_init(struct node* _this, c……
[/Quote]

顶一下,这个有用
DLUF 2011-05-26
  • 打赏
  • 举报
回复
来逛逛
Juejue 2011-05-26
  • 打赏
  • 举报
回复
typedef struct Bi{
char data;
struct Bi *left,*righ;
}BN,*Br;
二叉树的定义

pre(Br T){
if(T){
visit(T->data);
pre(T->left);
pre(T->righ);
}
}
不好意思,这才是二叉树的遍历
Juejue 2011-05-26
  • 打赏
  • 举报
回复
#include<stdio.h>
typedef struct Bi{
char data;
struct Bi *left,*righ;
}BN,*Br;

void creat(Br *T)//创建二叉树{
char c;
scanf("%c",&c);
if(c==' ') *T=NULL;
else {
(*T)->data=c;
*T=(Br)calloc(sizeof(BN));
creat(&((*T)->left));
creat(&((*T)->righ));
}
}

visit(char c,int L){ //二叉树的遍例
if(c=='F') printf("%c在第%d层\n",c,L);
printf("%c %d\n",c,L);
}

pre(Br T,int L){
if(T){
visit(T->data,L);
pre(T->left,L+1);
pre(T->righ,L+1);
}
}


main(){
int l=1;
Br T=NULL;
creat(&T);
pre(T,l);
getche();
}
C创建二叉树不用实例化的,就是用指针把开辟的空间连成一颗树就行了,楼主可以看一下数据结构
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 anyidan 的回复:]

the c programming language 中有二叉树的例子,lz 可以看看
[/Quote]

正好手上有这本电子书,扫了下目录没找到,请问在哪个章节啊,
能告诉下不?
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 adlay 的回复:]

C/C++ code

#include <stdlib.h>
#include <string>

struct node
{
long hashcode;
char *data;
struct node *left;
struct node *right;
};

void node_init(struct node* _this, char* str);
……
[/Quote]

已经搞定,用这种方法可以解决,多谢~
在Java和C++中是用new创建对象,而C中必须用malloc申请内存,
而且这么重要的功能还不是关键字,是库函数,
手边的参考书都没有介绍,看来大学教材可以扔了~

另外,代码有几行在Eclipse编译不了,需要改改,
但VC可以编译,感觉如果写C代码的话,VC不太遵循标准。
AnYidan 2011-05-25
  • 打赏
  • 举报
回复
the c programming language 中有二叉树的例子,lz 可以看看

vcf_reader 2011-05-25
  • 打赏
  • 举报
回复
面向对象是C++的特色,说白了就是class的封装,里面含有属性(数据)和方法(函数)
对于C而言,没有class,只有struct,不能封装方法(函数),用C实现面向对象必须通过下面的办法。

原理,面向对象就是要在struct里面封装函数,但是C的struct又不允许,怎么办呢?
有办法,变通。
struct可以封装指针,而函数是有指针的,所以可以把函数的指针封装到struct里面。于是面向对象的C程序就诞生了。
只不过这个用法很罗嗦。
hzc543806053 2011-05-25
  • 打赏
  • 举报
回复
加油加油
赵4老师 2011-05-25
  • 打赏
  • 举报
回复
C++只是一种面向对象的编程思想。
再抽象的编程语言,最后不都变成汇编代码了吗?我们完全可以说汇编语言是面向对象、脚本化、动态化、泛函化、并行化、分布化的语言。
www_adintr_com 2011-05-25
  • 打赏
  • 举报
回复

#include <stdlib.h>
#include <string>

struct node
{
long hashcode;
char *data;
struct node *left;
struct node *right;
};

void node_init(struct node* _this, char* str);

node* node_new(char* str)
{
node* p = (node*)malloc(sizeof(node));
node_init(p, str);
return p;
}

void node_insertleft(struct node* _this, struct node* child)
{
_this->left = child;
}

void node_insertright(struct node* _this, struct node* child)
{
_this->right = child;
}

void node_init(struct node* _this, char* str)
{
_this->left = NULL;
_this->right = NULL;
_this->data = (char*)malloc(strlen(str) + 1);
strcpy(_this->data, str);
}

void node_display(struct node* _this)
{
if(_this != NULL)
{
printf("%s -> ", _this->data);
node_display(_this->left);
node_display(_this->right);
}
}

int main()
{
struct node root;
node_init(&root, "Jack");

struct node* r = node_new("Rose");
node_insertleft(&root, r);
node_insertright(r, node_new("Adie"));
node_insertleft(r, node_new("Bill"));
node_display(&root);
}

加载更多回复(16)
首先需要为读者说明的是,《Java开发实战经典》,不只是一本纯粹讲解基础的书,里面更多的内容是为JAVA EE的开发而服务的,所以读者在学习本书的时候应该重点培养的是思想,按照程序解释问题的思想。 在本书的序言的视频之中已经为读者介绍了本书的整体结果,实际上每个读者必须首先搞清楚JAVA SE和JAVA EE的关系,如图2所示。 从图2中可以清楚的发现,如果要想进行JAVA EE的开发,JAVA SE是其中必要的组成部分,这也就是为什么在学习JAVA EE之前要读者一定要有扎实的JAVA SE基础了。 在本书的序章中也为读者讲解过,JAVA SE核心的部分就是以下四个: 1、 面向对象:主要是要求读者建立好一个面向对象的概念,并可以灵活的运用这些概念进行程序的分析,可以说在整个JAVA SE部分核心就是面向对象的开发,里面涉及的概念较多,但是所有的概念最终都是为接口和抽象类服务的,而所有JAVA开发中涉及到的各个设计模式,实际上也是针对于接口和抽象类的应用。 2、 类集框架:大部分的读者都应该听过或学习过数据结构,虽然从大学就开始学习《数据结构与算法》,但是实际上来讲,学习完后真正可以进行数据结构编写的人并不多,而且大部分的数据结构都是以C语言为基础讲解的,而类集就相当于是JAVA实现的数据结构,包括树、链表、队列等等,如果只是进行应用层次开发的读者没有必要深入了解其内部的操作,但是必须清楚的掌握其核心的接口和各个操作类。 3、IO操作:对于大部分的自学者而言,IO操作也许是最难过的一个坎了,如果没有很好的理解抽象类和接口的概念,那么要想充分的理解IO操作是很难的,在整个IO操作之中,完整的体现了Java语言多态性的设计思想,而且在学习IO的时候必须始终把握住一个原则:“根据使用的子类不同,输入输出的位置也不同”。 4、Java数据库操作(JDBC):JDBC首先并不能算是一门技术,更多的应该算是一种服务 —— Java提 供的数据库访问服务,里面提供了大量的操作接口,各个数据库生产商根据这些接口实现自己的数据库操作,从面向对象的设计上来看,用户完全没有必要考虑其接 口是如何实现的,而更多的是关心如何使用这些接口。而且从现在的项目开发中,读者可以清楚的发现,大部分的开发都是基于数据库的开发。

69,373

社区成员

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

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