C语言面向对象风格编程
前言
本文略谈C面向对象风格编程,如何使用过程式语言去模拟面向对象的特性?C面向对象的方式和形式很多,不一而足,本文的代码形式是模拟部分C++面向对象关键词并赋予其特性,这种方式对于初级程序员比较好理解。但是要明确的是,只要使用OO思想编写程序,那么写出的就是面向对象代码,比如Linux C。面向对象语言如C++,Java则是在编译器层面为语言做了那部分工作,所以使用过程式语言则需要通过写代码手动完成那部分工作。
面向对象简述
面向对象具备3大特性:封装、继承和多态。大多数语言都具有封装特性,只不过面向对象在封装上进一步增强,并且将数据和方法进行糅合。在面向对象中顶级存在是类和对象,而在过程式语言中函数则是顶级存在。
上代码和示例
Object.h是所有类需要包含的,Person.h里面有人类示例,ObjectStyleCoding.cpp是C语言面向对象示例。本文旨在抛砖引玉。并未实现继承和多态因为其比较复杂,但其思想是结构指针、查表和判断。
Object.h:
#include<stdlib.h>
#ifdef Cplusplus_H
namespace ObjectStyleCLang{
#else
extern "C"{
#endif #ifndef Object_Header_H
#define Object_Header_H
//boolean define
#define TRUE 1
#define FLASE 0 //class key words define
#define Public
#define Private static
#define ClassStatement(ClassName) struct ClassName
#define Class(ClassName) struct ClassName
#define ClassInnerPointer(ClassName) Class(ClassName)*ObjectThis
//memory define
#define NewArray(type,size) ((type*)malloc(sizeof(type)*size))
#define New(type) NewArray(type,1)
#define Delete(memory) free(memory) void ObjectCopy(unsigned char*,unsigned char*,unsigned int);
void ObjectCopy(unsigned char* dst,unsigned char* src,unsigned int Len)
{
unsigned int i=;
for(;i<Len;i++){
dst[i]=src[i];
}
} void StrCopy(char*dst,const char*src)
{
while (*src)
*dst++=*src++;
} #endif #ifdef Cplusplus_H
}
#else
}
#endif
Person.h:
#include "stdafx.h"
#include "Object.h" #ifdef Cplusplus_H
namespace ObjectStyleCLang{
#else
extern "C"{
#endif #ifndef Person_Header_H
#define Person_Header_H ClassStatement(Person);
Public void Person_constructor(Class(Person)*);
Public void setage(Class(Person)*,int);
Public int getage(Class(Person)*);
Public void setname(Class(Person)*,char*);
Public char* getname(Class(Person)*self); Class(Person){
//Class data
ClassInnerPointer(Person);
//Class data
Public int age;
Public char name[];
//method
Public void (*setAge)(Class(Person)*,int);
Public int (*getAge)(Class(Person)*);
Public void (*setName)(Class(Person)*,char*);
Public char* (*getName)(Class(Person)*);
}; Public void Person_constructor(Class(Person)*self)
{
self->ObjectThis=self;
self->getAge=getage;
self->setAge=setage;
self->getName=getname;
self->setName=setname;
self->age=self->name[]=;
} Public void setage(Class(Person)*self,int age)
{
self->age=age;
}
Public int getage(Class(Person)*self)
{
return self->age;
}
Public void setname(Class(Person)*self,char* str)
{
StrCopy(self->name,str);
}
Public char* getname(Class(Person)*self)
{
unsigned char i=;
char* name = NewArray(char,);
while(self->name[i]){
name[i]=self->name[i];
i++;
}
name[i]='\0';
return name;
} #endif #ifdef Cplusplus_H
}
#else
}
#endif
ObjectStyleCoding.cpp:
// ObjectStyleCoding.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "Person.h"
#include<iostream> int _tmain(int argc, _TCHAR* argv[])
{
Class(Person) fang;
Person_constructor(&fang);//构造函数
fang.setAge(&fang,);
fang.setName(&fang,"fang");
std::cout<<fang.getName(&fang)<<std::endl;
return ;
}
C语言面向对象风格编程的更多相关文章
- 零基础入门该如何实现C 语言面向对象编程(很有帮助)
零基础如果更快更好的入门C语言,如何在枯燥的学习中找到属于自己的兴趣,如果把学习当成一种事务性的那以后的学习将会很难有更深入的进步,如果带着乐趣来完成学习那将越学越有意思这样才会让你有想要更深入学习的 ...
- R 语言编码风格指南
R 语言是一门主要用于统计计算和绘图的高级编程语言.这份 R 语言编码风格指南旨在让我们的 R代码更容易阅读.分享和检查.以下规则系与 Google 的 R 用户群体协同设计而成. 概要: R编码风格 ...
- 来自 Google 的 R 语言编码风格指南
来自 Google 的 R 语言编码风格指南R 语言是一门主要用于统计计算和绘图的高级编程语言. 这份 R 语言编码风格指南旨在让我们的 R 代码更容易阅读.分享和检查. 以下规则系与 Google ...
- python03 面向对象的编程01
话不多说,直接进入正文: 编程思想: 我个人所了解的有2种,还有个函数式编程的概念模模糊糊(大概是把常用的代码封装成一个函数,重复调用即可,先认为就是这样吧) 1 面向对象:面向对象是把所有的事务物当 ...
- 【PHP面向对象(OOP)编程入门教程】1.什么是面向对象?
面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成 ...
- C++面向对象的编程
C++面向对象的编程 目录 对C++面向对象编程的理解 声明和定义类 声明和定义 构造函数 析构函数 静态成员和静态变量 类实例化对象 对象的浅复制和深复制 继承 单继承 多继承 虚函数 类模板 其他 ...
- Objective-C面向对象的编程
Objective-C面向对象的编程 目录 对面向对象编程思想的理解 类的声明和定义 类的声明和定义 对关键字super和self的理解 初始化函数 @property声明类成员 类的实例化 继承 组 ...
- Python 2.7 学习笔记 面向对象的编程
python是一种面向对象的语言.本文介绍如何用python进行面向对象的编程. 首先我们说下对象和类,类是一种类型的定义,对象是类的实例. 一.内置对象类型(内置类) 其实我们前面已经大量用到了对象 ...
- 用面向对象的编程方式实现飞机大战小游戏,java版
概述 本文将使用java语言以面向对象的编程方式一步一步实现飞机大战这个小游戏 本篇文章仅供参考,如有写的不好的地方或者各位读者哪里没看懂可以在评论区给我留言 或者邮件8274551712@qq.co ...
随机推荐
- MIPS平台移植apache 2.2.7
参考文章: http://wenku.baidu.com/view/94e08a20a5e9856a561260e2.html http://httpd.apache.org/docs/2.4/ins ...
- POJ C程序设计进阶 编程题#4:Tomorrow never knows?
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 甲壳虫的<A day ...
- php不使用插件导出excel
php不使用插件导出excel的简单方法,首先获取需要导出的数据的数组,数组的格式在下面. 之后就是定义文件名称和需要导出的excel的样式,最后就是循环数组,输出数据了 代码: $filename= ...
- php 安装xdebug扩展
php 扩展获取地址 http://pecl.php.net/package/ 编译安装的过程 wget http://pecl.php.net/get/xdebug-2.2.2.tgz tar -z ...
- ASP.NET MVC4学习笔记之Controller的激活
一. 高层相关类说明 当路由系统根据请求Url收集路由信息后,下一步就要将路由信息传给Controller激活系统,Controller激活系统负责实现了IController接口的Controlle ...
- Delphi XE5 for android 图片缩放和拖动处理
首先,需要分辨手势的类型. 有两种类型的手势: 一是标准手势(Standard Gestures): 在Windows,android上,标准手势都是用一个手指. 在Mac OS X and iOS上 ...
- How to using T-SQL statement copy table[SQL]
SQL复制表的几种方法: 仅复制表结构:select * into newTableName from OldTableName where 1 = 2 SQL复制整张表 select * into ...
- Ubuntu 12.04 添加新用户并启用root登录
启动root sudo passwd 输入密码 输入root 新密码并重复 su 切换root 添加用户比如hduser 修改密码hduserchmod u+w /etc/sudoersvi sudo ...
- 实战Django:官方实例Part6
我们终于迎来了官方实例的最后一个Part.在这一节中,舍得要向大家介绍Django的静态文件管理. 现在,我们要往这个投票应用里面添加一个CSS样式表和一张图片. 一个完整的网页文件,除了html文档 ...
- hdu 5326 Work
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5326 Work Description It’s an interesting experience ...