2014年8月25日,收藏家和杀手——面向对象的C++和C(一)
更通俗来说。就像打架,C++给我们了非常多武器。太多的选择和矛盾组合让我们无所适从,可以使用好这么多武器须要成年累月的经验,而商业项目就是最快最准的打倒对方,才无论你用啥。
想想看,当我拥有匕首、手枪、机关枪、火箭炮……时,我非常可能会忘了我的目的是打到对方,而当起了武器收藏家;但当我仅仅有匕首在手的时候呢?或许对方真正要倒霉了——我非常可能是个抱着誓死决心的杀手。
C++中有class(或者struct)这么一个keyword能够把数据和关联的方法封装成一个类。那么C语言呢?C语言的struct事实上也能够把数据和关联的方法封装在一起。
或许非常多人说。你骗人。C语言的struct中仅仅能放成员变量,不能放成员方法。或许你忘了还有函数指针这么一个东西,这个东西的存在,能够把方法像变量一样的放在C语言的struct中。例如以下(下面三个代码文件在Mac
OS X的XCode上完毕):
//
// person.h
// cthinking
//
// Created by Rafael Gu on 14-8-25.
// Copyright (c) 2014年 Rafael Gu. All rights reserved.
//
#ifndef _PERSON_H_
#define _PERSON_H_
struct person;
typedef unsigned char (*GET_AGE)(struct person *this);
typedef void (*SET_AGE)(struct person *this, unsigned char age);
// all public members
struct person {
];
GET_AGE get_age;
SET_AGE set_age;
};
struct person *person_create();
void person_destroy(struct person *p);
#endif // _PERSON_H_
//
// person.c
// cthinking
//
// Created by Rafael Gu on 14-8-25.
// Copyright (c) 2014年 Rafael Gu. All rights reserved.
//
#include "person.h"
#include <stdlib.h>
// all private members
struct _person {
unsigned char age;
};
static unsigned char _get_age(struct person *this)
{
struct _person *p = (struct _person *)(this
+ );
return p->age;
}
static void _set_age(struct person *this, unsigned char age)
{
struct _person *p = (struct _person *)(this
+ );
p->age = age;
}
struct person *person_create() {
struct person *p = (struct person *)malloc(sizeof(struct person)
+ sizeof(struct _person));
p->get_age = _get_age;
p->set_age = _set_age;
return p;
}
void person_destroy(struct person *p) {
free(p);
}
//
// main.c
// cthinking
//
// Created by Rafael Gu on 14-8-25.
// Copyright (c) 2014年 Rafael Gu. All rights reserved.
//
#include <stdio.h>
#include <string.h>
#include "person.h"
int main(int argc, const char *
argv[]) {
struct person *this = person_create();
, );
);
this->);
printf("%s's age is: %u\n", this->name, this->get_age(this));
person_destroy(this);
;
}
当然这里仅仅实现了private和public,没有protected。
- 继承——你看上面的person和_person的struct变体偏移就知道怎样组合不同结构体实现继承了。
- 重载、虚函数——你看上面的函数指针在“构造”函数才被指定。那么你应该明确怎样实现重载和虚函数了。
我的项目是基于上面代码的对象方式写得。假设全然实现C++或者Java的全部面向对象特性。也不太有用。
2014年8月25日,收藏家和杀手——面向对象的C++和C(一)的更多相关文章
- 09.25日记(2014年9月25日23:22:06)用java这么多年面向对象我真的懂了吗,测试先行理念会玩吗
二胡 (1)应该找些书来看看,工作N年并不代表就有N年的工作经验. (2)DiaTransit02,DiaDept02,DiaAirport02,DiaHighway02.都具有x,y属性为何不设计一 ...
- SE 2014年5月25日
如图配置 两实验 R1模拟总部,R2 与R3模拟分部 实验一 要求使用 IPSec VPN 主模式,使得总部与两分部内网可相互通讯 步骤: 1. 配置默认路由 [RT1]ip route-stat ...
- SE 2014年4月25日
1. 描述 STP 的计算过程 (1.根桥的选举 2.端口角色的确定) 根桥的选举 启用STP后,网络中桥ID最小的交换机会被选为根桥,桥ID由桥优先级和桥MAC两部分组成,优先级默认为32768,首 ...
- 马后炮之12306抢票工具(四)--抢票Demo,2014年1月9日终结版
时隔一年多,终于朋友的忽悠下吧抢票Demo的最后一步完善了,与2014年1月9日成功生成车票. Demo仅经过自己测试,并未在高峰期进行测试,代码质量很差,因为赶工,套用去年模板并未使用设计模式. 代 ...
- 无插件的大模型浏览器Autodesk Viewer开发培训-武汉-2014年8月28日 9:00 – 12:00
武汉附近的同学们有福了,这是全球第一次关于Autodesk viewer的教室培训. :) 你可能已经在各种场合听过或看过Autodesk最新推出的大模型浏览器,这是无需插件的浏览器模型,支持几十种数 ...
- 系列文章:老项目的#iPhone6与iPhone6Plus适配#(持续更新中,更新日期2014年10月12日 星期日 )
本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** ...
- 2016年12月25日 星期日 --出埃及记 Exodus 21:20
2016年12月25日 星期日 --出埃及记 Exodus 21:20 "If a man beats his male or female slave with a rod and the ...
- 转:[置顶] 从头到尾彻底理解KMP(2014年8月22日版)
[置顶] 从头到尾彻底理解KMP(2014年8月22日版)
- SQLSERVER2014 2014年4月1日发布
SQLSERVER2014 2014年4月1日发布 原文地址: http://blogs.technet.com/b/microsoft_blog/archive/2014/03/18/sql-ser ...
随机推荐
- [译] Pandas中根据列的值选取多行数据
# 选取等于某些值的行记录 用 == df.loc[df['column_name'] == some_value] # 选取某列是否是某一类型的数值 用 isin df.loc[df['column ...
- spring AOP详解三
CGLib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的结束拦截所有父类方法的调用,并顺势织入横切逻辑.我们采用CGLib技术可以编写一个可以为任何类创建织入横切逻辑代理对象 ...
- java EE技术体系——CLF平台API开发注意事项(1)——后端开发
前言:这是一篇帮助小伙伴在本次项目中快速进入到java EE开发的一些说明,为了让同组小伙伴们开发的时候,有个清晰点的思路.昨天给大家演示分享了基本概况,但没有留下文字总结说明,预防后期有人再次问我, ...
- NuGet之控制台管理程序包
NuGet作为VS的扩展程序,已经做好了UI,我们可以通过Manage NuGet Packages 的对话框.这里我们主要说说如何通过控制台进行包管理.使用命令行的方式,其实也是有其好处,对 ...
- 使用ssh建立隧道和web代理
动态端口转发(socket4/5代理): 通过ssh监听本地端口并把数据转发至远程动态端口 转发local port 至 ssh Server ssh -D ssh -qfTnN -D 本地目标端口 ...
- 刷题总结——树的同构(bzoj4337 树上hash)
Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如 ...
- Github与Eclipse连接(方法2成功:Pleiades)
2018-3-7 第1次尝试 主要参考这位大神的笔记:http://blog.csdn.net/zhangdaiscott/article/details/16939165 方法非常简单,从官网htt ...
- Ubuntu12.04 64bit版本下载Android源码完整教程
首先去官网http://source.android.com/source/initializing.html可以看到完整的安装教程.不过一般情况下,按照这个教程是无法一步到位的,因为中途肯定会遇到很 ...
- [暑假集训--数位dp]hdu5787 K-wolf Number
Alice thinks an integer x is a K-wolf number, if every K adjacent digits in decimal representation o ...
- from __future__ import unicode_literals, absolute_import
Q:python模块中的相对导入,绝对导入,有些地方会写 from __future__ import absolute_import 希望有个更详细的讲解. A: 相对导入:在不指明 package ...