日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

c语言模板程序,模板模式 (C语言实现)

發布時間:2023/12/31 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言模板程序,模板模式 (C语言实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. 問題

在面向對象系統的分析與設計過程中經常會遇到這樣一種情況:對于某一個業務邏輯(算法實現)在不同的對象中有不同的細節實現,但是邏輯(算法)的框架(或通用的應用算法)是相同的。Template提供了這種情況的一個實現框架。

二. 模式

Template 模式是采用繼承的方式實現這一點:將邏輯(算法)框架放在抽象基類中,并定義好細節的接口,子類中實現細節。

三. 代碼

abstractClass.h

#ifndef ABSTRACTCLASS_H

#define ABSTRACTCLASS_H

#include

#include

typedef struct {

size_t size;

void* (*ctor)(void *_self, va_list *params);

void* (*dtor)(void *_self);

void (*templateMethod)(const void *_self);

char *description;

} AbstractClass;

#endif

concreteClass1.h

#ifndef CONCRETECLASS1_H

#define CONCRETECLASS1_H

#include "abstractClass.h"

typedef struct {

const void *abstractClass;

void (*primitiveOperation1)(const void *_self);

void (*primitiveOperation2)(const void *_self);

int a;

} _ConcreteClass1;

extern const void *ConcreteClass1;

#endif

concreteClass1.c

#include "concreteClass1.h"

#include

#include

#include

#include

#include

static void *concreteClass1Ctor(void *_self, va_list *params) {

_ConcreteClass1 *self = _self;

const char *description = va_arg(*params, const char *);

(*(AbstractClass **)self)->description = calloc(1, strlen(description) + 1);

assert((*(AbstractClass **)self)->description);

strncpy((*(AbstractClass **)self)->description, description, strlen(description) + 1);

self->a = va_arg(*params, int);

return self;

}

static void *concreteClass1Dtor(void *_self) {

_ConcreteClass1 *self = _self;

if (NULL != (*(AbstractClass **)self)->description) {

free((*(AbstractClass **)self)->description);

(*(AbstractClass **)self)->description = NULL;

}

self->a = 0;

return self;

}

static void concreteClass1PrimitiveOperation1(const void *_self) {

if (NULL != (*(const AbstractClass * const *)_self)->description) {

fprintf(stdout, "%s\n", (*(const AbstractClass * const *)_self)->description);

}

}

static void concreteClass1PrimitiveOperation2(const void *_self) {

const _ConcreteClass1 *self = _self;

fprintf(stdout, "%d\n", self->a);

}

static void concreteClass1TemplateMethod(const void* _self) {

concreteClass1PrimitiveOperation1(_self);

concreteClass1PrimitiveOperation2(_self);

}

static AbstractClass _concreteClass1 = {

sizeof(_ConcreteClass1),

concreteClass1Ctor,

concreteClass1Dtor,

concreteClass1TemplateMethod,

NULL

};

const void *ConcreteClass1 = &_concreteClass1;

concreteClass2.h

#ifndef CONCRETECLASS2_H

#define CONCRETECLASS2_H

#include "abstractClass.h"

typedef struct {

const void *abstractClass;

void (*primitiveOperation1)(const void *_self);

void (*primitiveOperation2)(const void *_self);

double b;

} _ConcreteClass2;

extern const void *ConcreteClass2;

#endif

concreteClass2.c

#include "concreteClass2.h"

#include

#include

#include

#include

#include

static void *concreteClass2Ctor(void *_self, va_list *params) {

_ConcreteClass2 *self = _self;

const char *description = va_arg(*params, const char *);

(*(AbstractClass **)self)->description = calloc(1, strlen(description) + 1);

assert((*(AbstractClass **)self)->description);

strncpy((*(AbstractClass **)self)->description, description, strlen(description) + 1);

self->b = va_arg(*params, double);

return self;

}

static void *concreteClass2Dtor(void *_self) {

_ConcreteClass2 *self = _self;

if (NULL != (*(AbstractClass **)self)->description) {

free((*(AbstractClass **)self)->description);

(*(AbstractClass **)self)->description = NULL;

}

self->b = 0;

return self;

}

static void concreteClass2PrimitiveOperation1(const void *_self) {

if (NULL != (*(const AbstractClass * const *)_self)->description) {

fprintf(stdout, "%s\n", (*(const AbstractClass **)_self)->description);

}

}

static void concreteClass2PrimitiveOperation2(const void *_self) {

const _ConcreteClass2 *self = _self;

fprintf(stdout, "%f\n", self->b);

}

static void concreteClass2TemplateMethod(const void* _self) {

concreteClass2PrimitiveOperation1(_self);

concreteClass2PrimitiveOperation2(_self);

}

static AbstractClass _concreteClass2 = {

sizeof(_ConcreteClass2),

concreteClass2Ctor,

concreteClass2Dtor,

concreteClass2TemplateMethod,

NULL

};

const void *ConcreteClass2 = &_concreteClass2;

new.h

#ifndef __NEW_H__

#define __NEW_H__

void *New(const void *_class, ...);

void Delete(void *_class);

void TemplateMethod(const void *_class);

#endif

new.c

#include "new.h"

#include "abstractClass.h"

#include

#include

#include

#include

void *New(const void *_class, ...) {

const AbstractClass *class = _class;

void *p = calloc(1, class->size);

assert(p);

*(const AbstractClass **)p = class;

if (class->ctor) {

va_list params;

va_start(params, _class);

p = class->ctor(p, ?ms);

va_end(params);

}

return p;

}

void Delete(void *_class) {

const AbstractClass **class = _class;

if (_class && *class && (*class)->dtor) {

_class = (*class)->dtor(_class);

}

free(_class);

}

void TemplateMethod(const void *_class) {

const AbstractClass * const *class = _class;

if (_class && *class && (*class)->templateMethod) {

(*class)->templateMethod(_class);

}

}

main.c

#include "new.h"

#include "concreteClass1.h"

#include "concreteClass2.h"

int main(int argc, char *argv[]) {

void *p1 = New(ConcreteClass1, "ConcreteClass1", 10);

void *p2 = New(ConcreteClass2, "ConcreteClass2", 20.1);

TemplateMethod(p1);

TemplateMethod(p2);

Delete(p1);

Delete(p2);

return 0;

}

圖片來源:http://blog.csdn.net/hmsiwtv/article/details/9627019

總結

以上是生活随笔為你收集整理的c语言模板程序,模板模式 (C语言实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。