Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Arduino:覆盖打印类问题_C++_Arduino_Nodemcu_Arduino Esp8266 - Fatal编程技术网

C++ Arduino:覆盖打印类问题

C++ Arduino:覆盖打印类问题,c++,arduino,nodemcu,arduino-esp8266,C++,Arduino,Nodemcu,Arduino Esp8266,我试图创建一个库,用于重定向打印到打印类的数据。不幸的是,我被错误缠住了 错误:无法将变量“diagData”声明为抽象类型“PrintToString” 注意:因为以下虚拟函数在“PrintToString”中是纯函数 注意:虚拟大小\u t打印字符串::写入(uint8\u t) 我尝试了几种不同的实现方法,但没有成功。(来源于互联网) 链接 打印类:github.com/和 我的代码 PrintToString.h #ifndef PRINT_TO_STRING_H #defi

我试图创建一个库,用于重定向打印到打印类的数据。不幸的是,我被错误缠住了

错误:无法将变量“diagData”声明为抽象类型“PrintToString”

注意:因为以下虚拟函数在“PrintToString”中是纯函数

注意:虚拟大小\u t打印字符串::写入(uint8\u t)

我尝试了几种不同的实现方法,但没有成功。(来源于互联网)


链接

打印类:github.com/和

我的代码

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
TestSketch.ino(我省略了所有常量的内容)

#包括
#包括
常量字符*WIFI\u SSID
const char*WIFI_通行证
常量字符*API_主机
const uint16\u t API\u端口
const uint16\u t本地\u UDP\u端口
WiFiUDP-UDPClint;
打印字符串诊断数据;
uint64_t包装编号=0;
无效设置()
{
WiFi.begin(WiFi\u SSID、WiFi\u PASS);
UDPClint.begin(本地_UDP_端口);
while(WiFi.status()!=WL_已连接)
延迟(500);
WiFi.printDiag(diagData);
sendStringPacket(diagData.result());
diagData.clear();
}
void循环()
{
延迟(1000);
}
void sendStringPacket(字符串有效负载)
{
UDPClint.beginPacket(API_主机、API_端口);
uint64_t thisPNumber=包装编号++;
字符串thisPNumberStr;
而(此编号>0)
{
uint8_t digit=此编号%10;
此编号为concat(数字);
该编号/=10;
}
UDPClint.write(“;”);
对于(uint64_t i=0;i
这是因为该类在此处有:

写入的大小(uint8\u t)=0

无法实例化具有纯虚函数的类。所以方法
write(uint8\t)
必须以某种方式在代码中实现


<>编辑:考虑使用<代码> > StestRistCopyTe]()/<代码> >代码>写入(UIT88T)< /代码>。您可以在不使用sendStringPacket(diagData.result())的情况下重定向输出声明。

您也可以上传您的Arduino草图吗?顺便说一下,您在
String*数据的内存管理方面犯了严重错误。您应该首先删除
数据
,并在
~PrintToString()
中将其设为空。另外,在
clear()
中获取新字符串之前,您应该先
删除
。否则这门课会在几分钟内让你的Arduino崩溃。谢谢你的内存管理建议,我是一个初学者。这张草图很短,所以我把它包括进来回答。
#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;
}
#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();
}