ошибка: переопределение наследования класса ... - PullRequest
0 голосов
/ 09 октября 2019

Я просмотрел много похожих вопросов, но не могу найти ответ, подходящий для моей проблемы. Я пытаюсь создать абстрактный класс и расширить его в другом файле .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)
    {
    }
};

Остальное не имеет значения. Если я уберу наследство, все это скомпилируется.

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Вы не используете никаких охранников включения:

#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 

Таким образом, этот класс компилируется каждый раз, когда вы его включаете, и поэтому переопределяется.

0 голосов
/ 09 октября 2019

Я следовал совету @ NathanOliver

Правило: никогда не включайте файл cpp. Объявления классов должны быть в заголовочном файле, который включается там, где это необходимо, и в файл cpp, где находится реализация, должны быть скомпилированы и связаны со всеми вашими другими объектными файлами.

и реструктурированы мой проект. Проблема все еще появилась, поэтому я продолжил поиск в Интернете и выяснил, что добавление #pragma once в начале моего заголовочного файла решило проблему.

...