Я пытаюсь создать библиотеку для перенаправления данных, напечатанных в класс Print. Я, к сожалению, застрял на ошибке, которая читает
ошибка: невозможно объявить переменную diagData абстрактного типа PrintToString
примечание: потому что следующие виртуальные функции являются чистыми внутри ‘PrintToString’
примечание: виртуальный size_t PrintToString :: write (uint8_t)
Я попробовал несколько вариантов, как это реализовать, но безуспешно. (Источник из интернета)
связи
Класс печати: github.com/ Print.h а также Print.cpp
Мой код
PrintToString.h
#ifndef PRINT_TO_STRING_H
#define PRINT_TO_STRING_H
#include <Arduino.h>class PrintToString : public Print
{
private:
String* data;
public:
PrintToString();
~PrintToString();
String* results();
void clear();
size_t write(uint8_t) = 0;
size_t write(const uint8_t* buffer, size_t size);
};
#endif
PrintToString.cpp
#include "PrintToString.h"PrintToString::PrintToString()
{
data = new String();
}
PrintToString::~PrintToString()
{
delete data;
data = NULL;
}String* PrintToString::results()
{
return data;
}
void PrintToString::clear()
{
delete data;
data = new String();
}size_t PrintToString::write(const uint8_t* buffer, size_t size)
{
size_t n = 0;
while (size--)
{
if (data->concat(*buffer++))
n++;
else
break;
}
return n;
}
TestSketch.ino (я исключил содержимое всех констант)
#include <ESP8266WiFi.h>
#include <PrintToString.h>
const char* WIFI_SSID
const char* WIFI_PASS
const char* API_HOST
const uint16_t API_PORT
const uint16_t LOCAL_UDP_PORT
WiFiUDP UDPClint;
PrintToString diagData;
uint64_t packetNumber = 0;
void setup()
{
WiFi.begin(WIFI_SSID, WIFI_PASS);
UDPClint.begin(LOCAL_UDP_PORT);
while (WiFi.status() != WL_CONNECTED)
delay(500);
WiFi.printDiag(diagData);
sendStringPacket(diagData.result());
diagData.clear();
}
void loop()
{
delay(1000);
}
void sendStringPacket(String payload)
{
UDPClint.beginPacket(API_HOST, API_PORT);uint64_t thisPNumber = packetNumber++;
String thisPNumberStr;
while (thisPNumber > 0)
{
uint8_t digit = thisPNumber % 10;
thisPNumberStr.concat(digit);
thisPNumber /= 10;
}
UDPClint.write(';');
for (uint64_t i = 0; i < payload.length(); i++)
UDPClint.write(payload.charAt(i));
UDPClint.endPacket();
}
Это потому, что этот класс имеет чисто виртуальная функция Вот:
size_t write (uint8_t) = 0;
Класс с чисто виртуальной функцией не может быть создан. Итак, метод write(uint8_t)
должен быть как-то реализован в вашем коде.
РЕДАКТИРОВАТЬ: рассмотреть возможность использования кода, который вы использовали в sendStringPacket()
за write(uint8_t)
, Вы можете перенаправить вывод без использования sendStringPacket(diagData.result());
заявление.
Других решений пока нет …