Originally Posted by
laserlight
Use the opaque pointer idiom.
OK... Look at this. It actually works. But I`d rather hear your opinion about the approach. It is working however.
Private.h
Code:
#ifndef PRIVATE_H
#define PRIVATE_H
#include <stdio.h>
#include <stdlib.h>
struct Private;
typedef void (*setx)(Private*, int newx);
typedef int (*getx)(Private*);
struct Private_;
struct Private {
Private_ *privateField;
Private *self;
setx setX;
getx getX;
};
typedef void (*__setx)(Private_*, int);
typedef int (*__getx)(Private_*);
Private* getInstance();
#endif // PRIVATE_H
Private.c
Code:
#include "Private.h"
struct Private_ {
Private_* self;
int __x;
__setx privateSetX;
__getx privateGetX;
};
static inline int _getX(Private_ *self) {
return self->__x;
}
static inline void _setX(Private_ *self, int newX) {
self->__x = newX;
}
static inline int _getx(Private* self) {
return self->privateField->privateGetX(self->privateField);
}
static inline void _setx(Private* self , int newx) {
self->privateField->privateSetX(self->privateField, newx);
}
Private* getInstance() {
Private* p = (Private*) malloc(sizeof(Private));
p->privateField = (Private_*) malloc(sizeof(Private_));
p->privateField->__x = 0;
p->privateField->privateGetX = _getX;
p->privateField->privateSetX = _setX;
p->getX = _getx;
p->setX = _setx;
return p;
}
and the main.c
Code:
#include "Private.h"
int main(int argc, char** argv) {
Private* p = getInstance();
p->setX(p, 100);
printf("p`s X is %d now\n", p->getX(p));
}
Actually you can reach p`s privateField but nothing from inside it. Neat