该睡了但还没睡意,用最简单的方式实作一下
这种做法完全不支援多重继承,不过应该可以达到原本的需求
==== I2CDevice.h ====
typedef struct __I2C_Device I2C_Device;
struct __I2C_Device {
int (*init_func)(I2C_Device *dev);
int (*data_func)(I2C_Device *dev);
};
int I2CDevInitFn(I2C_Device *dev);
int I2CDevDataFn(I2C_Device *dev);
==== I2CDevice.c ====
#include "I2CDevice.h"
int I2CDevInitFn(I2C_Device *dev) {
return dev->init_func(dev);
}
int I2CDevDataFn(I2C_Device *dev) {
return dev->data_func(dev);
}
==== I2C_ADXL345.h ====
#include "I2C_Device.h"
typedef struct __I2C_ADXL345 I2C_ADXL345;
I2C_ADXL345 *I2CAdxl345New();
==== I2C_ADXL345.c ====
struct __I2C_ADXL345 {
I2C_Device dev;
int16_t rawData[3];
fload realData[3];
};
static int __Adxl345InitFn(I2C_Device *dev) {
I2C_ADXL345 *adxl345 = (I2C_ADXL345 *)dev;
// TODO: do something
}
static int __Adxl345DataFn(I2C_Device *dev) {
I2C_ADXL345 *adxl345 = (I2C_ADXL345 *)dev;
// TOOD: do something
}
I2C_Device_ADXL345 *I2CDevAdxl345New() {
I2C_ADXL345 *adxl345 = (I2C_ADXL345 *)malloc(sizeof(I2C_ADXL345);
adxl345->dev.init_func = &__Adxl345InitFn;
adxl345->dev.data_func = &__Adxl345DataFn;
}
==== main.c ====
#include "I2C_ADXL345.h"
int main (int argc, char **argv) {
I2C_ADXL345 *adxl345 = I2CDevAdxl345New();
I2CDevInitFn((I2C_Device *)adxl345);
I2CDevDataFn((I2C_Device *)adxl345);
return 0;
}
※ 引述《wtchen (没有存在感的人)》之铭言:
: (板工以身作则来示范怎么被电)
: 开发平台(Platform): (Ex: Win10, Linux, ...)
: Raspbien + kernel 4.4
: 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
: gcc 4.9.2-10
: 编译参数:-Wall -pedantic -O3 -std=gnu11
: 问题(Question):
: 正在研究如何用struct做简单的物件。
: 我有一个物件 I2C_Device
: typedef struct __I2C_Device {
: int (*init_func)(struct __I2C_Device* dev);
: int (*data_func)(struct __I2C_Device* dev);
: } I2C_Device ;
: 性质是I2C_Device 的物件很多,比如其中一个元件
: typedef struct {
: I2C_Device dev;
: int16_t rawData[3]; // 这两个元件每一个I2C_Device的物件
: float realData[3]; // 不相同,所以不能包在I2C_Device里
: } I2C_Device_ADXL345;
: I2C_Device_ADXL345* adxl345
: = (I2C_Device_ADXL345*)malloc(sizeof(I2C_Device_ADXL345));
: 如果我需要用 adxl345->dev.data_func 去修改adxl345->rawData跟realData
: 我可以怎么写?
: 例如
: (int16_t*)((I2C_Device*) adxl345+1)[1] = 2 ; // 设定rawData[1];
: (float*)((int16_t*)((I2C_Device*) adxl345+1)+3) = 2 ; // 设定realData[0];
: (可是我怕这种写法会因为alignment的关系得到不正确的结果)
: 还是有别的更好作法(只能用C的情况)?
: 请各位赐教。感谢。