Senast redigerat
Visa signatur
Every time you create an iterator: God kills a kitten.
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
Every time you create an iterator: God kills a kitten.
Copyright © 1999–2023 Geeks AB. Allt innehåll tillhör Geeks AB.
Citering är tillåten om källan anges.