gpt4 book ai didi

具有继承性的 C++ 工厂

转载 作者:行者123 更新时间:2023-11-30 02:17:56 29 4
gpt4 key购买 nike

<分区>

目前,我在一个项目中需要动态地向硬件 (Arduino) 添加和删除传感器。

为此,我为每个传感器创建了一个名为“Sensor”的基类和派生类。这个“传感器”类有一个名为 execute 的虚拟方法,并且这个方法在每个派生类上重写,因为每个传感器都是不同的,所以每种类型都需要不同的执行实现。在此示例中,我使用了 PIR,而 DTH11 具有派生类。

当需要添加传感器时,硬件将从服务器接收一个字符串,并根据接收到的字符串创建合适的传感器。为了简化这个问题中的事情,我只是在 main() 方法上手动完成。

为了存储传感器,我使用了一个 std::list,并且会不时调用 execute() 方法。

然而,基类(Sensor)的方法总是被执行,而不是交付的类,如下面的结果和预期结果所示。

class Sensor 
{
protected:
int GPIO;
char* name;
public:
virtual void execute() {std::cout << "This is sensor"} ;
int getGPIO() const;
void setGPIO(int);
char* getName() const;
void setName(char*);
Sensor(int sensorGPIO, char* sensorName) {//};
};

class PIR : public Sensor {
public:
void execute(){std::cout << "This is PIR"};
PIR(int gpio) : Sensor(gpio, "pir"){//};
};
class DHT11 : public Sensor {
public:
void execute() {std::cout << "This is DHT11"};
DHT11(int gpio) : Sensor(gpio, "dht11"){//};
};

class SensorFactory
{
public:
SensorFactory(){};
Sensor createSensor(char* sensorString, int gpio)
{
if(strcmp(sensorString, "pir") == 0)
{
return PIR(gpio);
}
else if(strcmp(sensorString, "dht11") == 0)
{
return DTH11(gpio);
}
};
};

int main()
{
std::list<Sensor> sensors;
SensorFactory factory();
Sensor s1 = factory.createSensor("pir", 10);
Sensor s2 = factory.createSensor("dth11", 12);
sensors.push_front(s1);
sensors.push_front(s2);

std::list<Sensor>::iterator i = sensores.begin();
while (i != sensores.end())
{
(i)->execute();
++i;
}

/* Expected results
This is PIR
this is DHT11
*/

/* Result
This is sensor
This is sensor
*/
}

我也试过这个:

class Sensor 
{
protected:
//
public:
virtual void execute() = 0;
//
};

但是我得到这个错误:

invalid abstract return type for member function 
Sensor SensorFactory::createSensor(char*, int)

请记住,我是 C++ 的新手,所以这可能不是解决此问题的方法(实现)。

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com