C中的OOPs。类的默认值
我正在学习在OOPs中编写C来学习Bruce Powel Douglass在书中提到的设计模式 我想创建一个类似python的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
\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();