C語言面向對象風格編程

前言ios

  本文略談C面向對象風格編程,如何使用過程式語言去模擬面向對象的特性?C面向對象的方式和形式不少,不一而足,本文的代碼形式是模擬部分C++面向對象關鍵詞並賦予其特性,這種方式對於初級程序員比較好理解。可是要明確的是,只要使用OO思想編寫程序,那麼寫出的就是面向對象代碼,好比Linux C。面嚮對象語言如C++,Java則是在編譯器層面爲語言作了那部分工做,因此使用過程式語言則須要經過寫代碼手動完成那部分工做。c++

面向對象簡述程序員

  面向對象具有3大特性:封裝、繼承和多態。大多數語言都具備封裝特性,只不過面向對象在封裝上進一步加強,而且將數據和方法進行糅合。在面向對象中頂級存在是類和對象,而在過程式語言中函數則是頂級存在。編程

 

上代碼和示例函數

  Object.h是全部類須要包含的,Person.h裏面有人類示例,ObjectStyleCoding.cpp是C語言面向對象示例。本文旨在拋磚引玉。並未實現繼承和多態由於其比較複雜,但其思想是結構指針、查表和判斷。spa

 

Object.h:指針

 1 #include<stdlib.h>
 2 #ifdef Cplusplus_H
 3 namespace ObjectStyleCLang{
 4 #else
 5 extern "C"{
 6 #endif
 7 
 8 #ifndef Object_Header_H
 9 #define Object_Header_H
10 //boolean define
11 #define TRUE 1
12 #define FLASE 0
13 
14 //class key words define
15 #define Public
16 #define Private static
17 #define ClassStatement(ClassName) struct ClassName
18 #define Class(ClassName) struct ClassName
19 #define ClassInnerPointer(ClassName) Class(ClassName)*ObjectThis
20 //memory define
21 #define NewArray(type,size) ((type*)malloc(sizeof(type)*size))
22 #define New(type) NewArray(type,1)
23 #define Delete(memory) free(memory)
24 
25 void ObjectCopy(unsigned char*,unsigned char*,unsigned int); 
26 void ObjectCopy(unsigned char* dst,unsigned char* src,unsigned int Len)
27 {
28     unsigned int i=0;
29     for(;i<Len;i++){
30         dst[i]=src[i];
31     }
32 }
33 
34 void StrCopy(char*dst,const char*src)
35 {
36     while (*src)
37         *dst++=*src++;
38 }
39 
40 #endif
41 
42 #ifdef Cplusplus_H
43 }
44 #else
45 }
46 #endif 

Person.h:code

 1 #include "stdafx.h"
 2 #include "Object.h"
 3 
 4 #ifdef Cplusplus_H
 5 namespace ObjectStyleCLang{
 6 #else
 7 extern "C"{
 8 #endif
 9 
10 #ifndef Person_Header_H
11 #define Person_Header_H
12 
13 
14 ClassStatement(Person);
15 Public void Person_constructor(Class(Person)*);
16 Public void setage(Class(Person)*,int);
17 Public int getage(Class(Person)*);
18 Public void setname(Class(Person)*,char*);
19 Public char* getname(Class(Person)*self);
20 
21 Class(Person){
22     //Class data
23     ClassInnerPointer(Person);
24     //Class data
25     Public int age;
26     Public char name[255];
27     //method
28     Public void (*setAge)(Class(Person)*,int);
29     Public int (*getAge)(Class(Person)*);
30     Public void (*setName)(Class(Person)*,char*);
31     Public char* (*getName)(Class(Person)*);
32 };
33 
34 
35 Public void Person_constructor(Class(Person)*self)
36 {
37     self->ObjectThis=self;
38     self->getAge=getage;
39     self->setAge=setage;
40     self->getName=getname;
41     self->setName=setname;
42     self->age=self->name[0]=0;
43 }
44 
45 Public void setage(Class(Person)*self,int age)
46 {
47     self->age=age;
48 }
49 Public int getage(Class(Person)*self)
50 {
51     return self->age;
52 }
53 Public void setname(Class(Person)*self,char* str)
54 {
55     StrCopy(self->name,str);
56 }
57 Public char* getname(Class(Person)*self)
58 {
59     unsigned char i=0;
60     char* name = NewArray(char,255);
61     while(self->name[i]){
62         name[i]=self->name[i];
63         i++;
64     }
65     name[i]='\0';
66     return name;
67 }
68 
69 #endif
70 
71 #ifdef Cplusplus_H
72 }
73 #else
74 }
75 #endif

 

ObjectStyleCoding.cpp:對象

 1 // ObjectStyleCoding.cpp : 定義控制檯應用程序的入口點。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include "Person.h"
 6 #include<iostream>
 7 
 8 int _tmain(int argc, _TCHAR* argv[])
 9 {
10     Class(Person) fang;
11     Person_constructor(&fang);//構造函數
12     fang.setAge(&fang,12);
13     fang.setName(&fang,"fang");
14     std::cout<<fang.getName(&fang)<<std::endl;
15     return 0;
16 }
相關文章
相關標籤/搜索