Задать вопрос
proudmore
@proudmore

Как правильно инкапсулировать методы одного класса в методы другого?

Здравствуйте. Мне нужно инкапсулировать методы библиотеки 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 <lib.h>

bool libr::connect_open() {
		#include <SPI.h>
		#include <Ethernet.h>
		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];

                                            ^


Что я делаю не так?
  • Вопрос задан
  • 545 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Никогда не делайте #include где-либо, кроме начала файла.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vanyamba-electronics
1 ошибка. Инклюд внутри функции. Поместите эти инклюды в начало файла lib.h.

2 ошибка. В методе lib::open() вы пытаетесь создать на стеке локальную версию объекта EthernetClient. Когда метод завершится, должен быть вызван его деструктор класса.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы