构造函数和对象声明的特定事项

Constructor and object declaration specific matter

本文关键字:对象 声明 构造函数      更新时间:2023-10-16

main.cpp文件中,我调用类的构造函数。在构造函数中,我从一些静态函数中设置了这个类的变量。所有的问题都是关于从NTP服务器设置时间。

作为getter的静态函数使用while循环来检查标志。如果未设置时间,则该标志为false;如果NTP服务器至少有一次响应,则该标记为true。如果标志为false,则while循环必须尝试永远获取时间(因为没有理由在没有时间的情况下继续),如果为true,则返回时间。

构造函数通过调用getter来设置变量,正如我所说的那样。

当我在main中声明该类的对象时,程序不会运行,因为我在串行打印中一无所获。如果我反对这个声明,它就行了。此外,它并不像是卡在while里面,因为我在里面放了一个串行打印,它也没有出现。我给出以下代码:

构造函数:

#import "DayTime.h"
#include "NTP.h"
DayTime::DayTime(){
    hour = NTP::getLCThour();
    minutes = NTP::getMin();
    seconds = NTP::getSec();
}

main.cpp文件:

#include <Arduino.h>
#include <SPI.h>
#include "NTP.h"
#include "DayTime.h"
#include "DayNumber.h"
DayTime DT;
DayNumber DN;
int main(void)
{
    init();
    setup();
    for (;;)
        loop();
    return 0;
}
void setup() {
    Serial.begin(9600);
    NTP::startEthernetAndUdp();
}
void loop() {
    NTP::getTime();
    //    Serial.println(DT.hour);
    //    Serial.println(DT.getTimeToDec());
    delay(3000);

在这里,如果我对名为DT的DayTime对象的声明进行注释,那么getTime函数就会起作用。

NTP.cpp部分:

1) 第一个吸气剂:

int NTP::getLCThour(){
    while(timeNTPSet==false){
        Serial.print("kolaw");
        getTime();
    }
    return lcthour;
}

2) 标头上的标志声明:

static bool timeNTPSet;

这是一个公共变量。

3) 它在.cpp文件开头的定义:

bool NTP::timeNTPSet= false;

这是在include之后的.cpp文件中设置的。

将标志设置为true的函数的最后一部分:

NTP NTP::getTime(){
    if (testNtpServer()){
        timeNTPSet = true;
        // We've received a packet, read the data from it
        Udp.read((unsigned char*)packetBuffer, NTP_PACKET_SIZE);

testNTPServer函数只测试3-4个不同的NTP服务器,以便至少从其中一个服务器获得时间。此外,如果我像前面所说的那样评论DayTime对象的声明,它也可以正常工作。

我该怎么做?

您将DayTime变量声明为全局变量。这意味着它的构造函数在调用main函数之前被调用。由于串行端口和网络没有设置,我猜它将无法工作。

您可以在DayTime类中创建一个初始化,执行构造函数的操作,并在设置串行端口和网络后调用它。