C中的OOP。类的默认值

时间:2018-07-11 11:31:30

标签: c oop embedded

我正在学习在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);

类似多态的东西。

2 个答案:

答案 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;在初始化函数中