www.pudn.com > ANSI_C_OOP.rar > Object.dc
#include#include // Object % Object ctor { return _self; } % Object dtor { return _self; } % Object differ { return _self != b; } % Object puto { const struct Class * class = classOf(_self); return fprintf(fp, "%s at %p\n", class -> name, _self); } % delete { if (_self) free(dtor(_self)); } % classOf { %casts assert(self -> class); return self -> class; } % sizeOf { const struct Class * class = classOf(_self); return class -> size; } // Class % Class dtor { %casts fprintf(stderr, "%s: cannot destroy class\n", self -> name); return 0; } % new { struct Object * object; va_list ap; %casts assert(self -> size); object = calloc(1, self -> size); assert(object); object -> class = self; va_start(ap, _self); object = ctor(object, & ap); va_end(ap); return object; } % super { %casts assert(self -> super); return self -> super; } // initialization // _Class and _Object are statically initialized structures extern const struct Class _Object; extern const struct Class _Class; %init static const struct Class _Object = { { & _Class }, "Object", & _Object, sizeof(struct Object), Object_ctor, Object_dtor, Object_differ, Object_puto }; static const struct Class _Class = { { & _Class }, "Class", & _Object, sizeof(struct Class), Class_ctor, Class_dtor, Object_differ, Object_puto }; const void * Object = & _Object; const void * Class = & _Class;