Пользовательские классы — переопределение ошибки void

Я получаю сообщение об ошибке переопределения моих классов, но не могу понять, что я сделал не так.

Ошибка: Icon.cpp:3:6: ошибка: переопределение 'void Icon::setIcon(byte (*)[8])'

Может ли кто-нибудь мне помочь в этом? Спасибо!

MyFile.ino

#include "MyIcon.h"

MyIcon myIcon;

MyIcon.h

#ifndef MyIcon_h
#define MyIcon_h

#include "Arduino.h"
#include "Icon.h"

class MyIcon : public Icon {
  public:
    MyIcon();
};

#endif

MyIcon.cpp

#include "MyIcon.h"

MyIcon::MyIcon() {

  byte _icon[8][8] = {
    {1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 2, 2, 2, 2, 1, 1},
    {1, 2, 1, 1, 1, 1, 2, 1},
    {2, 1, 2, 2, 2, 2, 1, 2},
    {1, 2, 1, 1, 1, 1, 2, 1},
    {1, 1, 1, 2, 2, 1, 1, 1},
    {1, 1, 2, 1, 1, 2, 1, 1},
    {0, 0, 0, 1, 1, 0, 0, 0},
  };
  MyIcon::setIcon(_icon);

Icon.h

#ifndef Icon_h
#define Icon_h

#include "Arduino.h"

typedef struct{
  byte r;
  byte g;
  byte b;
} RGB;

class Icon {
  public:
    Icon();
    inline virtual void setIcon(byte icon[8][8]){};
    inline virtual void setIconColors(RGB colors[3]){};
};

#endif

Icon.cpp

#include "Icon.h"

void Icon::setIcon(byte icon[8][8]) {
  __icon = icon;
}


void Icon::setIconColors(RGB colors[3]) {
  __colors = colors;
}

Отредактировано 11.09.18

Я попробовал внести следующие изменения, прежде чем благодаря KIIV понял, что не могу использовать такой массив.

Моя идея заключалась в том, чтобы иметь возможность вызвать getIcon() и вернуть массив байтов, который позже будет использоваться для подсветки определенных светодиодов на панели NeoMatrix.

Я думал, что смогу создать «библиотеку» значков, расширив базовый класс, установив правильный массив байтов в классе и используя его по мере необходимости (MyIcon, MyOtherIcon и т. д.)

Я что, совсем упустил суть?

Icon.h

void setIcon(byte icon[8][8]);
void setIconColors(RGB colors[3]);

Icon.cpp

#include "Icon.h"

Icon::Icon(){ }

void Icon::setIcon(byte icon[8][8]){
  memcpy(__icon, icon, sizeof(icon));
}


void Icon::setIconColors(RGB colors[3]){
  memcpy(__colors, colors, sizeof(colors));
}

, 👍0


2 ответа


2

Тела для setIcon и setIconColors есть как в файле заголовка, так и в файле cpp. Вы можете иметь их только в одном или другом - выбирайте.

Кроме того, способ назначения данных значка выйдет за рамки до того, как вы его начнете использовать. Вы создаете переменную локального массива, на которую затем передаете указатель на свой конструктор. Затем этот указатель сохраняется. Но затем вы выходите за пределы области видимости, указатель удаляется, а данные перезаписываются.

,

0

Как пишет Маженко, у вас два тела.

Тела в заголовочном файле пусты и, вероятно, вам это не нужно. Это нормально реализовать функции в файле cpp (что вы и делаете), поэтому в файле заголовка удалите {} в

inline virtual void setIcon(byte icon[8][8]){};
inline virtual void setIconColors(RGB colors[3]){};

так и получается

inline virtual void setIcon(byte icon[8][8]);
inline virtual void setIconColors(RGB colors[3]);
,