c 指针实现面向对象
指针是C的灵魂,正是指针使得C存在了这么多年,而且将长期存在下去。事实上,我自己不用C语言写程序已经有一年了,工作中接触到的只有java,python和javascript.最近用C完成了一下类似于OO中的封装(即"类")的概念,顺便把指针复习了下,感觉有必要记一下。
本文中的例子有这样两个概念:任务(Task),执行器(Executor)。任务有名称(taskName),并且可以执行(execute)。 而执行器与具体任务所执行的内容无关,只是回调(callback)任务的执行方法,这样我们的执行器就可以做的比较通用。而任务接口只需要实现一个execute方法即可,这样我们的任务就可以是多种多样的,可以通过统一的接口set给执行器执行。这是面向对象中基本的思想,也是比较常用的抽象方式。下面我们具体看下例子。
可以想象,main函数大概是这个样子:
int main(int argc, char** argv) {
Task *t1 = TaskConstruction("Task1", run);//此处的run是一个函数指针
Executor *exe = ExecutorConstruction();
exe->setTask(t1);
exe->begin();
exe->cancel();
Task *t2 = TaskConstruction("Task2", run2);//此处的run2也是一个函数指针,用于构造一个Task.
exe->setTask(t2);
exe->begin();
exe->cancel();
return (EXIT_SUCCESS);
}
运行结果为:
task : [Task1] is ready to run
[a = 1.200000, b = 2.300000]
[(a + b) * (a - b) = -3.850000]
cancel is invoked here
task : [Task2] is ready to run
another type of execute,just print out some information
cancel is invoked here
好了,下面详细看看实现:
定义接口
首先,定义Task和Executor两个实体的接口:
Task接口,注意其中的_this字段,这个指针在后边有很重要的作用,用于hold整个Task的实例。然后是一个taskName的字符串,和一个函数指针,这个指针在初始化(构造)Task时传入。这个execute()函数比较有意思,它不在内部使用,而是让执行器回调执行的。
#ifndef _ITASK_H
#define _ITASK_H
typedef struct Task{
struct Task *_this;
相关文档:
1.Linux文件系统
Linux
支
持多种文件系统,如ext、ext2、minix、iso9660、msdos、fat、vfat、nfs等。在这些具体文件系统的上层,Linux提供
了虚拟文件系统(VFS)来统一它们的行为,虚拟文件系统为不同的文件系统与内核的通信提供了一致的接口。下图给出了Linux中文件系统的关系:
在Linux平台下对文件编程可 ......
用linux C 下的函数调用创建中文目录、文件等,字符串的编码格式要求是utf-8格式的。
比如想要使用 int mkdir(const char *pathname, mode_t mode); 创建一个中文的目录。那么pathname的编码格式要求是utf-8的,而不能是gb3212/gbk的,否则就是乱码。
那么如果linux C下如何进行gbk<---->utf-8编码转换的编码装换的 ......
/* 包含C头文件 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* 包含SQLCA头文件 */
EXEC SQL INCLUDE sqlca;
EXEC SQL INCLUDE sqlda;
int main()
{
EXEC SQL BEGIN DECLARE SECTION;
int money;
......
前几天写了关于Keil与C/C++混合编程的若干问题,今天写的是继续前面的。
在使用C/C++混合编程的时候,程序运行到类里面的虚拟函数时死掉,查看其vptr值为0x00000000,这时候不知道怎么解决,后来自己编了一个实例程序可以通过,发现vptr的值是在__main里面的& ......