Пользовательские классы — переопределение ошибки 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

Обсуждение

Скрытая ошибка: вы также можете проверить конструктор MyIcon. Какой тип переменной (_icon) вы передаете в «Icon::setIcon()»?, @Mikael Patel

это пример вопроса для переполнения стека, а не для Arduino SE. https://arduino.stackexchange.com/tour, @Juraj

Вы должны сделать Icon чисто виртуальным, используя virtual void setIcon(byte icon[8][8]) = 0; и то же самое для setIconColors. В Icon.cpp полная ерунда. Даже если вы определите __icon и _colors в MyIcon как члены, Icon ничего об этом не знает. И массивы не могут быть назначены таким образом., @KIIV

Думаю, я сильно заблудился в своих попытках добиться того, чего хотел. Я хотел иметь возможность расширить базовый класс (Icon), чтобы иметь возможность создавать своего рода «библиотеку» значков. Значки создаются из массива байтов 8x8, поэтому я хотел иметь возможность запрашивать getIcon() из дочерний класс, такой как MyIcon, чтобы получить значок (который затем используется для освещения панели NeoMatrix. Я не осознавал, что вы не можете вернуть (или установить) массив байтов из функции., @Soch S.

Я бы посоветовал вам вообще не использовать для этого классы. Вы можете использовать значок в виде единого массива данных в PROGMEM и написать небольшую функцию для его анализа. У меня было бы что-то вроде одного байта для количества цветов (N), двух байтов для размеров значка (Ш, В) (если необходимо), N*3 байтов для информации о цвете, затем байтов WxH для изображения значка. Если количество цветов всегда одинаково или размеры значка всегда одинаковы, вы можете опустить значения N и/или W,H., @Majenko

Привет, Маженко, я пытаюсь следовать вашим предложениям и попробовал следующую суть. Кажется, это работает для массива байтов значков, но у меня возникла проблема с назначением извлечения моей структуры после ее размещения в PROGMEM, поэтому я удалил это ключевое слово. Для меня это совершенно новый подход, поэтому буду рад любым отзывам! https://gist.github.com/Nate1661/0eea9200e9d1c86187c2acf205ba3602, @Soch S.


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]);
,