欢迎来到天天文库
浏览记录
ID:15854877
大小:72.00 KB
页数:12页
时间:2018-08-06
《用c语言封装数据与方法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、用C语言封装数据与方法作者:野男人 来源:博客园 发布时间:2008-08-2215:55 阅读:1098次 原文链接 [收藏] 类的一个特征就是数据与方法封装在一起,在编译器越来越智能的今天,大多数程序员已经习惯了数据与方法“本来”就是一个“整体”的概念。事实是不是这样呢?在面向对象语言出现之前的程序世界又是什么样的呢?让我们先回到C的世界中,看看那里的数据与方法(C中称为函数)是什么样子的。 在C中通常定义一个结构体用来把一些数据组合在一块儿,然后定义一个函数处理这个结构体。例如
2、:/*版本1:*/typedef struct _SampleData{ int data1; char data2[10];}SampleData;/*函数定义,打印SampleData结构的数据*/void ProcessData(){ SampleData data; data.data1 = 12; strcpy(data.data2,"123456789"); printf("data1=%d, data2=%s", data.data1, data.d
3、ata2); }可以看到数据与对数据的操作是分离的,只要把数据所在的文件包含进来,就可以任意定义一个函数来进行操作。 接着再看看用C++把数据与方法封装在一起的代码形式。//C++版本class SampleData{public: SampleData(){}; ~SampleData(){}; void ProcessData() { data1 = 12; strcpy(data2,"123456789"); cout<<"
4、data1="<5、 int data1; char data2[10]; void ProcessData(); //声明操作}SampleData; 而ProcessData()函数的实现依然跟【版本1】一样。编译,链接。真好,没有出现任何的错误。是否这样就可以了呢?噢,忘记了一个重要的步骤,还没有在任何地方使用过这个SampleData结构体的ProcessData操作呢。OK,没有关系,在主函数声明调用一下吧。大概像下面这样:void main(){ SampleData data6、; data.ProcessData();} 再编译,通过。链接,出现错误:unresolvedexternalsymbol"public:void__thiscall_SampleData::ProcessData(void)"(?ProcessData@_SampleData@@QAEXXZ)。编译器找不到结构体中声明的ProcessData函数的具体实现,看来现在这样调用data.ProcessData()是不行的。编译器并没有我们想象的那样自动地把ProcessData的声明与它的实现7、对应起来。那么怎样做才能达到预先的目的呢? 如果能把ProcessData()函数的地址赋给SampleData结构里的操作声明,那么一切问题都解决了。看来【版本2】也需要改进一下。 /*版本3:*/ typedef struct _SampleData{ int data1; char data2[10]; void (*ProcessData)(); //注意,已经改为ProcessData的函数指针}SampleData;主函数也得改一下,在使用data.Proces8、sData()之前,把函数ProcessData的地址赋给结构体里的函数指针变量。结果如下:void main()...{SampleData data;data.ProcessData = ProcessData; //注意,初始化函数指针变量data.ProcessData();} 再编译、链接,终于通过。到这里你已经认为这样成功的实现了上面定义的SampleData的C++版本。不过不要高兴的太早,做个测试看看。void main()...{ Sa
5、 int data1; char data2[10]; void ProcessData(); //声明操作}SampleData; 而ProcessData()函数的实现依然跟【版本1】一样。编译,链接。真好,没有出现任何的错误。是否这样就可以了呢?噢,忘记了一个重要的步骤,还没有在任何地方使用过这个SampleData结构体的ProcessData操作呢。OK,没有关系,在主函数声明调用一下吧。大概像下面这样:void main(){ SampleData data
6、; data.ProcessData();} 再编译,通过。链接,出现错误:unresolvedexternalsymbol"public:void__thiscall_SampleData::ProcessData(void)"(?ProcessData@_SampleData@@QAEXXZ)。编译器找不到结构体中声明的ProcessData函数的具体实现,看来现在这样调用data.ProcessData()是不行的。编译器并没有我们想象的那样自动地把ProcessData的声明与它的实现
7、对应起来。那么怎样做才能达到预先的目的呢? 如果能把ProcessData()函数的地址赋给SampleData结构里的操作声明,那么一切问题都解决了。看来【版本2】也需要改进一下。 /*版本3:*/ typedef struct _SampleData{ int data1; char data2[10]; void (*ProcessData)(); //注意,已经改为ProcessData的函数指针}SampleData;主函数也得改一下,在使用data.Proces
8、sData()之前,把函数ProcessData的地址赋给结构体里的函数指针变量。结果如下:void main()...{SampleData data;data.ProcessData = ProcessData; //注意,初始化函数指针变量data.ProcessData();} 再编译、链接,终于通过。到这里你已经认为这样成功的实现了上面定义的SampleData的C++版本。不过不要高兴的太早,做个测试看看。void main()...{ Sa
此文档下载收益归作者所有