OOP In C

来源:互联网 发布:淘宝联盟用店铺红包 编辑:程序博客网 时间:2024/06/16 01:52

OOP In C


http://stackoverflow.com/questions/1403890/how-do-you-implement-a-class-in-c
How do you implement a class in C?


date_client.c

#include "date.h"#include <stdio.h>#include <assert.h>void TestDate(Date* date, int after, int before) {  printf("Year: %d\n", GetYear(date));  printf("Month: %d\n", GetMonth(date));  printf("Day: %d\n", GetDay(date));  char* date_string = GetDateString(date);  printf("Formatted: %s\n", date_string);  DestroyDateString(&date_string);  assert(date_string == NULL);  DestroyDateString(&date_string);  IncreaseDate(date);  date_string = GetDateString(date);  printf("1 day later: %s\n", date_string);  DestroyDateString(&date_string);  int i;  for (i = 0; i < after; ++i) {    IncreaseDate(date);  }  date_string = GetDateString(date);  printf("Another %d day(s) later: %s\n", after, date_string);  DestroyDateString(&date_string);  for (i = 0; i < before; ++i) {    DecreaseDate(date);  }  date_string = GetDateString(date);  printf("Another %d day(s) earlier: %s\n", before, date_string);  DestroyDateString(&date_string);  }int main() {  int year, month, day;  int after, before;  scanf("%d%d%d%d%d", &year, &month, &day, &after, &before);  Date* date1 = CreateDate(year, month, day);  assert(sizeof(*date1) == sizeof(Date));  Date* date2 = CopyDate(date1);  assert(date1 != date2);  assert(date1->month == date2->month);  SetDate(date1, year + 1, month, day);  SetYear(date1, year);  SetMonth(date1, month);  SetDay(date1, day);  TestDate(date1, after, before);  DestroyDate(&date1);  DestroyDate(&date2);  assert(date1 == NULL);  DestroyDate(&date2);  return 0;}/*One probable test case:1900 2 28 365 366Year: 1900Month: 2Day: 28Formatted: 1900-02-281 day later: 1900-03-01Another 365 day(s) later: 1901-03-01Another 366 day(s) earlier: 1900-02-28*/

date.h

#ifndef DATE_H_#define DATE_H_typedef struct {  int year, month, day;} Date;Date* CreateDate(int year, int month, int day);void DestroyDate(Date** p);Date* CopyDate(const Date* date);int GetYear(const Date* date);int GetMonth(const Date* date);int GetDay(const Date* date);void SetYear(Date* date, int year);void SetMonth(Date* date, int month);void SetDay(Date* date, int day);void SetDate(Date* date, int year, int month, int day);char* GetDateString(const Date* date);void DestroyDateString(char** p);void IncreaseDate(Date* date);void DecreaseDate(Date* date);#endif

date.c*

#include "date.h"#include <stdio.h>#include <stdlib.h>Date* CreateDate(int year, int month, int day){  Date* date = (Date*)malloc(sizeof(Date));  date->year = year;  date->month = month;  date->day = day;  return date;}int daysOfMonth(int year, int month) {  if (month == 2) {    if (year%4 == 0 && year%100 != 0 || year%400 == 0) return 29;    else return 28;   }  else if (month == 4||month == 6||month == 9||month == 11) return 30;  return 31;}void DestroyDate(Date** p){  free(*p);  *p = NULL;}Date* CopyDate(const Date* date){  Date* date1 = (Date*)malloc(sizeof(Date));  date1->year = date->year ;  date1->month = date->month ;  date1->day = date->day ;  return date1;}int GetYear(const Date* date){  int year1 = date->year;  return year1;}int GetMonth(const Date* date){   int month1 = date->month;  return month1;}int GetDay(const Date* date){   int day1 = date->day;  return day1;}void SetYear(Date* date, int year){date->year = year;}void SetMonth(Date* date, int month){date->month = month;}void SetDay(Date* date, int day){date->day = day;}void SetDate(Date* date, int year, int month, int day){  date->year = year;  date->month = month;  date->day = day;}char* GetDateString(const Date* date){  char * dateString = (char*)malloc(11);  sprintf(dateString,"%04d-%02d-%02d",date->year,date->month,date->day);  return dateString;}void DestroyDateString(char** p){  free(*p);  *p = NULL;}void IncreaseDate(Date* date){  if (date->day < daysOfMonth(date->year,date->month)) date->day++;  else {     if (date->month == 12) {           date->year++;           date->month = 1;         }     else date->month++;     date->day = 1;   }}void DecreaseDate(Date* date){  if (date->day > 1) date->day--;  else {      if (date->month == 1) {             date->year--;             date->month = 12;           }      else date->month--;      date->day = daysOfMonth(date->year,date->month);     }}

//注意指针的内存分配及释放

0 0