Permalänk
Hedersmedlem

Leka med OO i C (inte C++!)

Låt oss säga att man vill koda lite små-OOigt men man inte har tillgång till C++ (snälla fråga inte varför, strunta bara i att svara om det stör dig så mkt ). Villkor: Det måste fungera på alla C-kompilatorer så inga hemmagjorda preprocessorer tack :).

Tänker då att man kan ta att fula sig lite såhär!

1. Man tar single-inheritance såhär: http://tinobox.com/wordpress/object-oriented-c-coding/

2. Man implementerar obj->setMemberVal(1) såhär:

#include <stdio.h> #include <stdlib.h> #define _(obj,func,...) (*((obj).func))(&(obj),__VA_ARGS__) #define del(ptrToObj) { _(*ptrToObj,del); free(ptrToObj); } typedef struct MyClass { void (*func)(struct MyClass* aThis, int val); void (*del)(struct MyClass* aThis); void * dynMem; int internVal; } MyClass; void setVal(MyClass* aThis, int val) { aThis->internVal = val; printf("\n Ran some member func, set internVal to: %i", aThis->internVal); } void theKiller(MyClass* aThis) { free(aThis->dynMem); printf("\n Ran destructor"); } MyClass * MyClass_cnstr(MyClass * aThis) { aThis->internVal = 0; aThis->func = &setVal; aThis->dynMem = malloc(1); aThis->del = &theKiller; return aThis; } MyClass * new_MyClass() { printf("\n Ran dyn alloc constructor"); return MyClass_cnstr((MyClass *) malloc(sizeof(MyClass))); } MyClass _MyClass() { MyClass out; printf("\n Ran constructor"); return *MyClass_cnstr(&out); } int main() { MyClass mcStr = _MyClass(); MyClass * mcPtr = new_MyClass(); _(*mcPtr, func, 1); _(mcStr, func, 2); printf("\n mc->internVal: %i", mcPtr->internVal); printf("\n mcStr.internVal: %i", mcStr.internVal); del(mcPtr); _(mcStr,del); return 0; }

Ok det ovan är säkert inte alls det mest optimala, men det fungerar. Skulle dock vilja ha lite annorlunda syntax, men _(obj, fcnName, params) är det enda jag kan få fram. Ideer?

Det är alltså raden

#define _(obj,func,...) (*((obj).func))(&(obj),__VA_ARGS__)

som jag skulle vilja ha lite snyggare

Visa signatur

Every time you create an iterator: God kills a kitten.