我正在学习在OOP中编写C语言,以学习Bruce Powel Douglass在《 Design Patterns for Embedded Systems in C》一书中提到的设计模式。
我想像在python中那样创建一个__init__
方法,该方法中的值是预定义的,并且仅当用户/开发人员希望更改他/她需要更改的值时。
我做了什么
我定义了一个带有默认值的instance of a struct
,并将它extern
定义到了应用程序/中间件中。因此,如果用户需要两个实例,则需要使用默认值创建另一个实例。
/* Sensor */
typedef struct sensor sensor;
struct sensor{
uint8_t parameter1;
uint8_t parameter2;
uint8_t parameter3;
uint8_t parameter4;
void (*initilize)(uint8_t parameter1, uint8_t parameter2,
uint8_t, parameter3, uint8_t parameter4);
void (*read)(uint8_t * parameter1, uint16_t parameter2);
void (*write)(uint16_t *parameter2);
};
void sensor_init(sensor *this, uint8_t parameter1, uint8_t parameter2,
uint8_t, parameter3, uint8_t parameter4);
void sensor_read(sensor *this, uint8_t * parameter1, uint16_t parameter2);
void sensor_write(sensor *this, uint16_t *parameter2);
然后,每次用户需要制作一个新对象时,我都必须:
sensor Sensor1 = {
.parameter1 = 1, .parameter2 = 2, .parameter3 = 3, .parameter4 = 4,
.initilize = sensor_init, .read = sensor_read, .write = sensor_write
};
是否有更好的初始化方法?用户/开发人员可以呼叫的地方
sensor Sensor;
Sensor.init();
或
Sensor.Init(parameter1 = 22);
类似多态的东西。
答案 0 :(得分:3)
您可以创建一个 factory 函数,该函数根据“类”创建并设置“对象”。这是一种非常普通的方法。
示例
sensor sensor_create()
{
return (sensor){
.parameter1 = 1, .parameter2 = 2, .parameter3 = 3, .parameter4 = 4,
.initilize = sensor_init, .read = sensor_read, .write = sensor_write
};
};
// ...
sensor Sensor1 = sensor_create();
答案 1 :(得分:1)
您可以将结构添加为函数指针初始化的参数:
void (*initilize)(uint8_t parameter1, uint8_t parameter2, uint8_t, parameter3, uint8_t parameter4, struct class1_t *this);
然后您可以this->parameter1 = parameter1;
在初始化函数中