C中的OOPs。类的默认值

C中的OOPs。类的默认值,c,oop,embedded,C,Oop,Embedded,我正在学习在OOPs中编写C来学习Bruce Powel Douglass在书中提到的设计模式 我想创建一个类似python的\uuuuu init\uuuuu方法,其中值是预定义的,并且只有当用户/开发人员希望更改它时,他/她才需要 我做了什么我使用默认值定义了结构的实例,并将其扩展到应用程序/中间件。因此,如果用户需要两个实例,他需要使用默认值创建另一个实例 /* Sensor */ typedef struct sensor sensor; struct sensor{ uint8

我正在学习在OOPs中编写C来学习Bruce Powel Douglass在书中提到的设计模式

我想创建一个类似python的
\uuuuu init\uuuuu
方法,其中值是预定义的,并且只有当用户/开发人员希望更改它时,他/她才需要

我做了什么
我使用默认值定义了结构的
实例
,并将其扩展到应用程序/中间件。因此,如果用户需要两个实例,他需要使用默认值创建另一个实例

/* 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 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();

您可以将结构添加为函数指针初始化的参数:

void(*初始化)(uint8参数1、uint8参数2、uint8参数3、uint8参数4、结构类1*this)


然后您可以
this->parameter1=parameter1很好,谢谢!如何在运行时更改参数值
sensor Sensor1=sensor\u create(parameter 1=22)
?例如,如果两个传感器有不同的设置,可以缩写为:
sensor-sensor\u-create(){return(sensor){1,2,3,4,sensor\u-init,sensor\u-read,sensor\u-write};}
,因为所有成员都已初始化,因此不需要membe指示符(我的旧C编译器更喜欢它)@ClamentJohn不幸的是,您必须为所有成员变量提供参数。您可以创建不同的工厂函数,为不同和常见的组合使用不同的参数集。哦,明白了。谢谢,这真的很有帮助。所以我使用工厂函数(这也是我希望学习的设计模式的一部分)来创建实例,在'init'之前,我必须更新'params'。Cool@pbn我的函数返回一个。关于“成员函数”,有一件事你忘记了:传递对象本身!编译器不会自动执行此操作,函数中没有
变量。您必须显式地将对象传递给函数,方法是修改它们以获取指向“对象”的指针。啊,是的。如
无效写入(此传感器,uint26\u t参数2)
?是,如果我希望
self
处理这些函数中的对象,则需要此选项。好主意,我也可以在对象中放置缓冲指针和其他东西。一切都会井然有序。很抱歉,这是一个新概念:这是一个潜在的危险,特别是在嵌入式系统中。许多编码标准不允许函数指针在RAM中使用,或者至少与数据结合使用。@Olaf我听说过函数指针可能带来的危险,但作者“Bruce Powel Douglass”没有(或者没有,我还在读这本书)在书中提到这一点。当嵌入式系统必须处理函数指针时,它与PC有多大的不同?另外,您如何构建模块化的、可重用的代码?@ClamentJohn:如果EMI的breeak功能指针稍微翻转,您是否愿意以200+公里/小时的速度坐在车/火车/飞机上??我不知道作者,也不知道这本书,但一般来说,读一本书并不能减轻一个人的思考负担。
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();