带有继承的C++工厂
C++ Factory with inheritance
目前我正在进行一个项目,需要在硬件(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++还比较陌生,所以这可能不是解决这个问题的方法(实现(。
问题是您按值返回Sensor
。这将创建原始传感器的副本,而不需要额外的扩展数据(也称为切片(。
用途:
std::unique_ptr<Sensor> createSensor(const std::string& sensorString, int gpio)
{
if(sensorString == "pir")
{
return std::make_unique<PIR>(gpio);
}
else if(sensorString == "dht11")
{
return std::make_unique<DTH11>(gpio);
}
};
当您将execute
作为纯虚拟函数时,您会看到它试图通过创建Sensor
来创建副本。在存储传感器时也会遇到同样的问题,请使用一个包含唯一指针的容器。
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用Unique_ptr确保工厂中的对象唯一
- 带有继承的C++工厂
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 工厂方法:分配和strcpy_s的差异
- C++库和自注册类:客户端应用程序中的工厂映射为空
- 这个工厂类在这个C++视频中的意义何在?
- 此工厂功能有什么问题?
- 注册对对象工厂的调用会导致段错误
- 工厂设计模式优化
- 在 C++ 中返回新的构造函数(*this)工厂
- 确保在编译期间仅同时使用来自同一工厂的对象
- 在工厂或C++类中包含数据库 .h 文件
- 在基类中编写工厂方法
- WIC 工厂将始终在 Windows7 上为 nullptr("What's a Creel?"教程中使用)
- 抽象工厂结构的差异
- 编写可测试的代码 - lambda 函数和unique_ptr中的basic_istream工厂
- 下面抽象工厂设计模式的实现是正确的吗
- 没有用于初始化模拟工厂的匹配构造函数
- 从工厂方法返回的ComPtr的引用计数增加两次