前提・実現したいこと
C言語で、オブジェクト指向のクラスのようなものを、マクロで作ろうとしているのですが、ガベージコレクション(みたいなもの)が、うまくできません。
該当のソースコード
C言語
1#include<studio.h> 2#define self void *cslf 3void *cslf; 4#define private(class_name) struct private_ ## class_name 5#define public struct 6#define classdef(class_name) typedef class_name* class_name; struct class_name instance_of_ ## class_name 7#define funcAttach(class_name) void init_ ## class_name(void) 8#define settings(class_name, parent_class) int myNumber; void(*delete)(void*); struct parent_class base; struct private_ ## class_name private 9#define dtor(class_name) void class_name ## __delete(void *cslf) 10#define new(class_name, args) classes[class_number] = calloc(sizeof(struct class_name), 1); do{if(class_number<510){memcpy(classes[class_number], &instance_of_ ## class_name, sizeof(struct class_name)); ((class_name)classes[class_number])->myNumber=class_number; cslf=classes[class_number]; class_name args; cslf=0; classes[class_number+1]=class_name ## __delete; class_number+=2; }else{free(classes[class_number]); classes[class_number]=0; }}while(0) 11#define setThis(class_name) do{class_name this=(class_name)cslf;}while(0) 12#define INIT(class_name, parent_class) instance_of_ ## class_name.delete=class_name ## __delete; instance_of_ ## _class_name=instance_of_ ## parent_class 13#define Delete(object) do{object->delete(object); classes[object->myNumber]=0; free(object); }while(0) 14typedef void *obj; 15int depth = -1; 16int class_number=0; 17void *classes[512][512]{{0}}; 18struct No_superclass{ 19} 20struct No_superclass instance_of_No_superclass; 21void delete_garbage(void){ 22 for(int i=0;i<class_number;i+=2){ 23 if(classes[depth][i]!=0){ 24 void(*dlt)(void*)= classes[depth][i+1]; 25 dlt(classes[depth][i]); 26 free(classes[depth][i]); 27 classes[depth][i]=0; 28 } 29 } 30 depth—; 31 class_number=0; 32} 33 34 35 36/* クラス定義 */ 37private(Human) { 38 int age; 39} public Human { 40 char name[64]; 41 int(*getAge)(obj); 42 void(*setAge)(obj, int); 43} 44dtor(Human) { 45 setThis(Human); 46 /* デストラクタ */ 47} 48void Human__setAge(self, int age) { 49 setThis(Human); 50 this->private.age=age; 51} 52int Human__getAge(self) { 53 setThis(Human); 54 return this->private.age; 55} 56void Human(void) { 57 setThis(Human); 58 /* コンストラクタ */ 59} 60 61int main(int argc, char** argv) { 62 /* ブロックの始めでdepthを+1 */ 63 depth++; 64 65 Human h = new(Human,()); 66 h.setAge(h, 57); 67 printf("This human is %d years old.¥n", h.getAge(h)); 68 69 /* ブロックの最後でガベージを削除 */ 70 delete_garbage(); 71}
起きている問題は何でしょうか。
「うまくいかない」は誰にも何も伝えない表現なので避けてください。
>C言語で、オブジェクト指向のクラスのようなもの・・・・意図は何でしょう?
>ガベージコレクション・・・実装の問題ですか?
参考:https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3#%E5%AE%9F%E8%A3%85
C++使えないですか?
回答1件
あなたの回答
tips
プレビュー