【问题标题】:C++ Factory with inheritance [duplicate]具有继承的C ++工厂[重复]
【发布时间】:2019-04-03 15:09:55
【问题描述】:

目前我在一个项目中,我需要在硬件 (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++ 比较陌生,所以这可能不是解决这个问题的方法(实现)。

【问题讨论】:

  • 如果编译器支持,您可能应该返回 std::unique_ptr。如果没有,则传感器*。

标签: c++ design-patterns


【解决方案1】:

问题是您按值返回 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 来创建副本。 存储传感器时也有同样的问题,请改用唯一指针的容器。

【讨论】:

  • this 和 std::list&lt;Sensor&gt; sensors; 是一个列表,其中包含 Sensors 而不是子类的实例
  • 哦,是的,当然。
  • 其实是同一个问题:切片
猜你喜欢
  • 2018-07-27
  • 2012-03-26
  • 2013-06-13
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多