我浏览了许多类似的问题,但是找不到适合我问题的答案。我尝试创建一个抽象类,并将其扩展到另一个.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)
{
}
};
其余无关紧要。如果我删除继承,整个内容就会编译。
答案 0 :(得分:1)
您不使用任何包含卫兵:
#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
因此,每次您添加此类时,都会对其进行编译,因此需要重新定义。
答案 1 :(得分:0)
我遵循@NathanOliver给出的提示
经验法则:切勿包含cpp文件。类声明应位于一个头文件中,该文件应包含在需要的位置,而cpp文件应在其中编译实现,并链接到所有其他目标文件。
并重组了我的项目。问题仍然出现,因此我继续在网上搜索并发现在头文件开头添加#pragma once
可以解决此问题。