2016-11-06 62 views
0

对于一个学校项目,我必须在C++中实现一个传感器类,它有一个私有属性active(boolean),它指示传感器是否处于活动状态。 我必须以这样的方式重载++运算符,如果使用operator ++,属性active将被设置为true。C++过载运算符++

我实现下述(sensor.cpp):

Sensor::Sensor(int id, std::string vendor) : _id(id), _vendor(vendor) { 
    std::cout << "Sensor created with id: " << Sensor::getId() << std::endl; 
    _status = false; 
} 

bool Sensor::getStatus() { 
    return _status; 
} 

void Sensor::setStatus(bool status) { 
    _status = status; 
} 

Sensor& Sensor::operator++() { 
    Sensor result = *this; 
    this->setStatus(true); 
    return result; 
} 

main.cpp中:

int main(int argc, char *argv[]) { 
    Sensor * sensor = new Sensor(1, "sample vendor"); 
    sensor->setStatus(false); 
    sensor++; 
    std::cout << "status: " << sensor->getStatus() << std::endl; 
} 

我注意到,程序停止与上次执行方法(饰面)将要执行的传感器 - > setStatus(假);在main.cpp中,但没有错误显示在我的终端中,我的编译器也没有抱怨。

有人有一个想法我做错了什么,我如何纠正它,使状态设置为true?

预先感谢

+0

权解决这些问题的工具是您的调试器。在*堆栈溢出问题之前,您应该逐行执行您的代码。如需更多帮助,请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您应该\编辑您的问题,以包含一个[最小,完整和可验证](http://stackoverflow.com/help/mcve)示例,该示例再现了您的问题,以及您在调试器。 –

+0

不少错误。更好地阅读[this](http://stackoverflow.com/questions/4421706/operator-overloading)。另外,布尔上的'++'没有多大意义。 – juanchopanza

+0

'Sensor result = * this;'应该是'Sensor&result = * this;'以避免返回对临时引用的引用(更好的是:'return * this;'直接),即使你不使用它。你也使用增量运算符来做其他事情。不好。 –

回答

2

由于sensor是一个指针,sensor++递增指针不是对象。最简单的解决方案就是首先不要使用指针。

int main() { 
    Sensor sensor{1, "sample vendor"}; 
    sensor.setStatus(false); 
    sensor++; 
    std::cout << "status: " << sensor.getStatus() << std::endl; 
} 

另一种解决方案是使用(*sensor)++ ...

int main() { 
    std::unique_ptr<Sensor> sensor = 
     std::make_unique<Sensor>(1, "sample vendor"); 
    sensor->setStatus(false); 
    (*sensor)++; 
    std::cout << "status: " << sensor->getStatus() << std::endl; 
} 

代码中的另一个错误是在这里:

Sensor& Sensor::operator++() { 
    // You don't want to do this... it creates a copy! 
    Sensor result = *this; 
    this->setStatus(true); 
    // This is a dangling reference! 
    return result; 
} 

使用这个代替:

Sensor& Sensor::operator++() { 
    this->setStatus(true); 
    return *this; 
} 
+0

OP对于奇怪的错误有多大的创造性? :) –

+0

C++是一种伟大的语言,它使人们能够制造创造性的错误。 –

+1

检查一个:http://stackoverflow.com/questions/40427771/weird-error-when-reading-a-large-txt-file-in-c/40427819#40427819。创造性地狱。 –