2016-11-06 63 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。創造性地獄。 –