c++ - 尽管使用了包含防护,但错误 : redefinition of class,

标签 c++ class constructor arduino function-definition

我是 javascript/typescript 开发人员,但对 Arduino/c++ 很陌生
我有一个类(见下面的 h 和 cpp)并且有这个编译器错误:

DotMatrix.cpp:13:1: error: redefinition of 'DotMatrix::DotMatrix(uint8_t, MD_MAX72XX::moduleType_t, uint8_t, uint8_t, uint8_t)'
 DotMatrix::DotMatrix(uint8_t maxDevices, MD_MAX72XX::moduleType_t hardwareType, uint8_t clkPin, uint8_t dataPin, uint8_t csPin) 
 ^
In file included from sketch/DotMatrix.cpp:5:0:
DotMatix.h:10:3: error: 'DotMatrix::DotMatrix(uint8_t, MD_MAX72XX::moduleType_t, uint8_t, uint8_t, uint8_t)' previously defined here
   DotMatrix(uint8_t maxDevices, MD_MAX72XX::moduleType_t hardwareType, uint8_t clkPin, uint8_t dataPin, uint8_t csPin) 
   ^
exit status 1
我不明白为什么...
以下是文件:
DotMatix.h:
#ifndef DotMatrix_h
#define DotMatrix_h

#include <MD_MAX72xx.h> 
#include <MD_Parola.h> 

class DotMatrix
{
  public:
    DotMatrix(uint8_t maxDevices, MD_MAX72XX::moduleType_t hardwareType, uint8_t clkPin, uint8_t dataPin, uint8_t csPin) 
    : _parola(hardwareType, csPin, maxDevices)
    {};

    void setup();
  
  private:
    MD_Parola _parola;
};

#endif
DotMatix.cpp:
#ifndef DotMatrix_cpp
#define DotMatrix_cpp

//#include <stdint.h>
#include "DotMatix.h"
#include "Arduino.h"

#include <MD_Parola.h>  // Parola library to scroll and display text on the display (needs MD_MAX72xx library)  https://github.com/MajicDesigns/MD_Parola
#include <MD_MAX72xx.h> // Library to control the Maxim MAX7219 chip on the dot matrix module   https://github.com/MajicDesigns/MD_MAX72XX

const int FRAME_DELAY = 25;

DotMatrix::DotMatrix(uint8_t maxDevices, MD_MAX72XX::moduleType_t hardwareType, uint8_t clkPin, uint8_t dataPin, uint8_t csPin) 
: _parola(hardwareType, csPin, maxDevices)
{
  //MD_Parola(MD_MAX72XX::moduleType_t mod, uint8_t csPin, uint8_t numDevices = (uint8_t)'\001')
  _parola = MD_Parola(hardwareType, csPin, maxDevices);  
}

void DotMatrix::setup()
{
  this->_parola.begin();
  _parola.displayClear();
  _parola.displaySuspend(false);
  byte i = 3;                                            //EEPROM.read(0);
  _parola.setIntensity(i);                               // Values from 0 to 15
  _parola.setTextEffect(PA_SCROLL_LEFT, PA_SCROLL_LEFT); //in and out effect
  _parola.displayScroll("Hallokes ...", PA_LEFT, PA_SCROLL_LEFT, FRAME_DELAY);
}

#endif
作为引用,这是调用该类的 ino 文件的(片段):
#include "DotMatix.h"

// Define the number of 8x8 dot matrix devices and the hardware SPI interface
#define MAX_DEVICES 4
#define HARDWARE_TYPE MD_MAX72XX::DR1CR0RR0_HW

#define CLK_PIN   14 //D5
#define DATA_PIN  13 //D7
#define CS_PIN    2  //D4


DotMatrix dotMatrix(MAX_DEVICES, HARDWARE_TYPE, CLK_PIN, DATA_PIN, CS_PIN);

void setup() {
  dotMatrix.setup();
}

void loop() {
}

我正在使用带有 Arduino 扩展的 VS Code IDE。

最佳答案

void func(); // function declaration
void func() { blablabla; } // function definition.
您可能会看到定义和声明之间的简单区别。一个有{ ,另一个没有。 (全局)函数只能在代码库中定义一次,而不是两次。否则你的编译器将不知道选择哪个函数——第一个?第二个?
你做了:
// in DotMatix.h:
DotMatrix(blablaa)
{}; // yes this is definition
并且还做了:
// in DotMatrix.cpp
DotMatrix::DotMatrix(ublabla, who cares)
{ // also definition
编译器看到同一函数的两个定义并退出并出现错误。
包含保护通常用于防止包含相同的文件两次。您的多个定义在多个文件中。也不需要在源文件中包含保护 - 源文件不应该被包含,所以它们总是被处理一次。

关于c++ - 尽管使用了包含防护,但错误 : redefinition of class,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63325411/

相关文章:

c++ - 包含源中的 Qt undefined reference

c++ - 使用外部库的 OpenCV C++ 应用程序部署

python - 如何使用 __str__ 更改对象属性的显示方式?

java - 如何在 CardLayout Swap 上将一张卡片的文本字段值显示到另一张卡片

c++ - Cout 使用运算符 << 调用方法

c++ - 子类化和添加数据成员

python - “矩形”对象没有属性 'width'

javascript - 不能通过 Babel 的 transform-class-properties 在父类构造函数中使用子类的属性

java - 如何区分类的两个实例

c++ - 在 C++ 中缩小 2D vector