2014年8月25日,收藏家和杀手——面向对象的C++和C(一)
//
// 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 {
char name[32];
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 + 1);
return p->age;
}
static void _set_age(struct person *this, unsigned char age) {
struct _person *p = (struct _person *)(this + 1);
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();
memset(this->name, 0, 32);
strncpy(this->name, "rafael", 6);
this->set_age(this, 35);
printf("%s‘s age is: %u\n", this->name, this->get_age(this));
person_destroy(this);
return 0;
}
- 继承——你看上面的person和_person的struct变体偏移就知道如何组合不同结构体实现继承了。
- 重载、虚函数——你看上面的函数指针在“构造”函数才被指定,那么你应该明白如何实现重载和虚函数了。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。