QT编程中的非初始化开关箱错误



这是我检查笔记本电脑电池状态的代码。我没有正确地解决这个问题,因为编译器给了我有关开关情况的错误:

UPower *u = new UPower(this);
    Battery *b;
    foreach (Battery *bat, *u->batteries()) {
        b = u->batteries()->value(bat->path());
    }
    ui->batteryProg->setValue(b->percentage());
    switch( b->state() ) {
        case Battery::FullyCharged:
            ui->batteryStatus->setText( tr( "Full" ) );
            break;
        case Battery::Discharging:
            ui->batteryStatus->setText( tr( "Discharging" ) );
            break;
        case Battery::Charging:
            ui->batteryStatus->setText( tr( "Charging" ) );
            break;
        default:
            ui->batteryStatus->setText( tr( "No Battery" ) );
            break;
    }
    ui->batteryframe->setVisible(true);

这是编译过程输出的错误输出:

 make: *** [Makefile:2028: corebox.o] Error 1
 make: *** Waiting for unfinished jobs....
 coreaction/coreaction.cpp: In member function 'void 
 coreaction::batteryCheck()':
 coreaction/coreaction.cpp:114:25: warning: 'b' may be used 
 uninitialized in this function [-Wmaybe-uninitialized]
     switch( b->state() ) {
             ~~~~~~~~^~
 ==> ERROR: A failure occurred in build().
 Aborting...

我在做什么错?

这是重要的部分:

 coreaction/coreaction.cpp:114:25: warning: 'b' may be used 
 uninitialized in this function [-Wmaybe-uninitialized]
     switch( b->state() ) {
             ~~~~~~~~^~

它指出,如果循环为空并且B永远无法设置,则可以使用B非专业化,这将是正确的。

foreach (Battery *bat, *u->batteries()) {
        b = u->batteries()->value(bat->path());
    }

希望有帮助。一个解决方案是在将开关插入初始化为nullptr之前测试b。

这是重要的部分,nullptr和非初始化的指针之间存在差异。

Battery* b = nullptr; // nullptr
Battery* b;           // uninitialized

解决方案

Battery *b = nullptr;
    foreach (Battery *bat, *u->batteries()) {
        b = u->batteries()->value(bat->path());
    }
    if (!b)
        return;

最新更新