Как правильно инкапсулировать методы одного класса в методы другого? Здравствуйте. Мне нужно инкапсулировать методы библиотеки Ethernet, и работающей под ней SPI, в свой класс.
Вот, как я попытался это сделать:
lib.h#ifndef lib_h
#define lib_h
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
class lib {
public:
void add_var(char *varname, int var_value);
bool connect_open();
void send();
};
#endif
lib.cpp#include
bool libr::connect_open() {
#include
#include
EthernetClient client;
byte addr[4]= {8,8,8,8};
if (client.connect(addr, 80)) {
Serial.println("Connect is done");
return true;
}
else{
Serial.println("Connect is failed");
return false;
}
}
А выдает мне это следующие ошибки: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h: In member function 'bool lib::connect_open()':
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h:313:18: error: local class 'class lib::connect_open()::SPIClass' shall not have static data member 'uint8_t lib::connect_open()::SPIClass::initialized' [-fpermissive]
static uint8_t initialized;
^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h:314:18: error: local class 'class lib::connect_open()::SPIClass' shall not have static data member 'uint8_t lib::connect_open()::SPIClass::interruptMode' [-fpermissive]
static uint8_t interruptMode; // 0=none, 1=mask, 2=global
^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h:315:18: error: local class 'class lib::connect_open()::SPIClass' shall not have static data member 'uint8_t lib::connect_open()::SPIClass::interruptMask' [-fpermissive]
static uint8_t interruptMask; // which interrupts to mask
^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h:316:18: error: local class 'class lib::connect_open()::SPIClass' shall not have static data member 'uint8_t lib::connect_open()::SPIClass::interruptSave' [-fpermissive]
static uint8_t interruptSave; // temp storage, to restore state
^
In file included from C:\Program Files (x86)\Arduino\libraries\Ethernet\src/Ethernet.h:7:0,
from C:\Users\lib\Documents\Arduino\libraries\lib\lib.cpp:5:
C:\Program Files (x86)\Arduino\libraries\Ethernet\src/EthernetClient.h:38:19: error: local class 'class lib::connect_open()::EthernetClient' shall not have static data member 'uint16_t lib::connect_open()::EthernetClient::_srcport' [-fpermissive]
static uint16_t _srcport;
^
In file included from C:\Users\lib\Documents\Arduino\libraries\lib\lib.cpp:5:0:
C:\Program Files (x86)\Arduino\libraries\Ethernet\src/Ethernet.h:18:37: error: local class 'class lib::connect_open()::EthernetClass' shall not have static data member 'uint8_t lib::connect_open()::EthernetClass::_state [4]' [-fpermissive]
static uint8_t _state[MAX_SOCK_NUM];
^
C:\Program Files (x86)\Arduino\libraries\Ethernet\src/Ethernet.h:19:44: error: local class 'class lib::connect_open()::EthernetClass' shall not have static data member 'uint16_t lib::connect_open()::EthernetClass::_server_port [4]' [-fpermissive]
static uint16_t _server_port[MAX_SOCK_NUM];
^
Что я делаю не так?

21 Авг 2019 в 07:04
261 +1
1
Ответы
1

Ошибка возникает из-за того, что вы включили библиотеки SPI и Ethernet внутри метода connect_open(), что приводит к конфликту символов и статических переменных в этих библиотеках. Лучше всего подключить их в начале вашего файла lib.cpp, чтобы избежать таких проблем:

#include <lib.h>
#include <SPI.h>
#include <Ethernet.h>
bool lib::connect_open() {
EthernetClient client;
byte addr[4]= {8,8,8,8};
if (client.connect(addr, 80)) {
Serial.println("Connect is done");
return true;
}
else{
Serial.println("Connect is failed");
return false;
}
}

Также убедитесь, что вы правильно используете пространство имен в вашем классе lib, чтобы избежать других конфликтов. Вам нужно удалить #include "WProgram.h" из вашего заголовочного файла lib.h, так как это не требуется для Arduino IDE версии 1.0 и выше.

После внесения этих изменений вам следует устранить ошибки и ваш код должен компилироваться без проблем.

20 Апр 2024 в 13:08
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир