首页 > 解决方案 > 错误:重新定义“类...”继承

问题描述

我浏览了许多类似的问题,但找不到适合我的问题的答案。我尝试创建一个抽象类并将其扩展为不同的.cpp文件。如果我尝试编译,我会收到此错误。

In file included from src/main.cpp:6:0:
src/MQBIOTExecutor.cpp:4:7: error: redefinition of 'class MQBIOTExecutor'
 class MQBIOTExecutor
       ^
In file included from src/MQBIOT.cpp:3:0,
                 from src/main.cpp:5:
src/MQBIOTExecutor.cpp:4:7: error: previous definition of 'class MQBIOTExecutor'
 class MQBIOTExecutor
       ^
In file included from src/MyExecutor.cpp:3:0,
                 from src/main.cpp:7:
src/MQBIOTExecutor.cpp:4:7: error: redefinition of 'class MQBIOTExecutor'
 class MQBIOTExecutor
       ^
In file included from src/MQBIOT.cpp:3:0,
                 from src/main.cpp:5:
src/MQBIOTExecutor.cpp:4:7: error: previous definition of 'class MQBIOTExecutor'
 class MQBIOTExecutor
       ^

我已经尝试过很多事情,例如将抽象类放入头文件或使所有函数纯虚拟而不是纯虚拟等。

我的MQBIOTExecutor.cpp

#include <Arduino.h>
#include <ArduinoJson.h>

class MQBIOTExecutor
{
public:
    virtual void getState() = 0;

    virtual void getCommands() = 0;
    virtual void executeCommand(JsonDocument jdoc) = 0;

    virtual void getConfig() = 0;
    virtual void setConfig(JsonDocument jdoc) = 0;

    virtual void getSensor() = 0;

    virtual void extend(String topic, String payload, JsonDocument payloadJsonDoc) = 0;
};

我的MyExecutor.cpp

#include <Arduino.h>
#include <ArduinoJson.h>
#include <MQBIOTExecutor.cpp>

class MyExecutor : public MQBIOTExecutor
{
public:
    virtual void getState()
    {
    }

    virtual void getCommands()
    {
    }
    virtual void executeCommand(JsonDocument jdoc)
    {
    }

    virtual void getConfig()
    {
    }
    virtual void setConfig(JsonDocument jdoc)
    {
    }

    virtual void getSensor()
    {
    }

    virtual void extend(String topic, String payload, JsonDocument payloadJsonDoc)
    {
    }
};

其余的无关紧要。如果我删除继承,整个事情都会编译。

标签: c++inheritanceabstract-class

解决方案


您不使用任何包含警卫:

#ifndef MQBIOTEXECUTER_H //only define this class the first time the pre-processor sees this definition
#define MQBIOTEXECUTER_H

#include <Arduino.h>
#include <ArduinoJson.h>

class MQBIOTExecutor
{
public:
    virtual void getState() = 0;

    virtual void getCommands() = 0;
    virtual void executeCommand(JsonDocument jdoc) = 0;

    virtual void getConfig() = 0;
    virtual void setConfig(JsonDocument jdoc) = 0;

    virtual void getSensor() = 0;

    virtual void extend(String topic, String payload, JsonDocument payloadJsonDoc) = 0;
};

#endif 

所以这个类在你每次包含它时都会被编译,因此会被重新定义。


推荐阅读