Пользовательские классы — переопределение ошибки 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));
}
@Soch S., 👍0
2 ответа
Тела для setIcon
и setIconColors
есть как в файле заголовка, так и в файле cpp. Вы можете иметь их только в одном или другом - выбирайте.
Кроме того, способ назначения данных значка выйдет за рамки до того, как вы его начнете использовать. Вы создаете переменную локального массива, на которую затем передаете указатель на свой конструктор. Затем этот указатель сохраняется. Но затем вы выходите за пределы области видимости, указатель удаляется, а данные перезаписываются.
Как пишет Маженко, у вас два тела.
Тела в заголовочном файле пусты и, вероятно, вам это не нужно. Это нормально реализовать функции в файле 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]);
- Как использовать SPI на Arduino?
- Светодиоды: разница между общим анодом и общим катодом
- Библиотека DHT.h не импортируется
- Как повторить кусок кода
- Почему эта программа на C++ не может прочитать Serial.write() моего arduino?
- Как изменить переменную при нажатии кнопки, подключенной к контакту 2
- Корпус кнопки и переключателя
- GSM-модуль IOT-GA6 Arduino + ошибка CME 58