2016-03-03 59 views
-1

我的應用程序有一個很奇怪的問題。我正在使用STM開發板NUCLEO-F411RE和MBED Online IDE。我的函數myObj()返回一個對象;返回的對象的值被打印到LCD上。實現多個返回語句時出現奇怪的結果C++

我似乎發現了一些問題,可能在編譯器/鏈接器中使用了Return Value Optimization。 我無法用錯誤的應用程序代碼解釋問題。

在myObj()中添加第二個return語句時,開始出現奇怪的行爲。 隨着單一返回聲明一切正常,因此我懷疑一些基本問題。

預期LCD結果:DAR 不正確的LCD結果:酒吧

代碼片段:

class charStream { 
    public: 
    charStream();          // Constructor 
    ~charStream(); 
    void in(char c); 
    void undoIn(); 
    char out(); 
    bool empty(); 
    int size(); 
    void readReset(); 
    char read(); 
    bool readEnd(); 

    private: 
    charStreamElement *firstElement; 
    charStreamElement *lastElement; 
    charStreamElement *readElement; 
    int streamSize;   
    }; 

charStream myObj() { 
    charStream ch; 
    charStream ch2; 

    ch.in('d');ch.in('a');ch.in('r'); 
    ch2.in('D');ch2.in('A');ch2.in('R'); 

    return ch;  
//  return ch2; 
//When above line is uncommented lcd prints Bar. When commented lcd prints dar 
} 

int main() { 
     lcdPrintStr(&lcds, myObj()); 
     do{} while(1); 
} 



void charStream::in(char c) { 
    charStreamElement *newElement; 

    newElement = new charStreamElement(c,NULL,firstElement); 
    firstElement->setPrevious(newElement); 
    firstElement=newElement; 
    if (streamSize==0) 
     lastElement=firstElement; 
    streamSize++; 
} 

class charStreamElement { 
    public: 
    charStreamElement(char c, charStreamElement *prev, charStreamElement *next);        // Constructor 
    ~charStreamElement(); 
    char elementValue(); 
    charStreamElement *getPrevious(); 
    charStreamElement *getNext(); 
    void setLast(); 
    void setPrevious(charStreamElement *prev); 

private: 
    char value; 
    charStreamElement *nextElement; 
    charStreamElement *prevElement; 
}; 

charStreamElement::charStreamElement(char c, charStreamElement *prev, charStreamElement *next) { 
    value=c; 
    nextElement=next; 
    prevElement=prev; 
} 

void charStreamElement::setPrevious(charStreamElement *prev) { 
    prevElement=prev; 
} 
+3

歡迎來到Stack Overflow!請** [編輯] **用[mcve]或[SSCCE(Short,Self Contained,Correct Example)](http://sscce.org)您的問題 – NathanOliver

+1

您尚未顯示足夠精確的代碼 - 但我沒有看到聲明的拷貝構造函數... –

+1

'charStream'可能有違反規則的三條規則 –

回答

1

通過引入一個拷貝構造函數解決。

函數myObj()然後使用copy-constructor並返回正確的結果,即使第二次返回活動(並非在實際情況下會使用它,但它強調了在這種情況下如何去處理)。

charStream &charStream::operator=(const charStream &copy) { 
    char c; 
    charStreamElement *temp; 

    streamSize=0; 
    firstElement=NULL; 
    lastElement=NULL; 
    readElement=NULL; 

    temp=copy.lastElement; 
    while (temp!=NULL) { 
     c=temp->elementValue(); 
     in(c); 
     temp=temp->getPrevious(); 
    } 
} 


charStream myObj() { 
    charStream ch; 
    ch.in('d');ch.in('a');ch.in('r'); 

    charStream ch2 = ch; 
    ch2.in('D');ch2.in('A');ch2.in('R'); 
    return ch;  
    return ch2; 
} 

對象ch和ch2在堆棧上創建並且彼此獨立。 LCD現在可以正常打印dar,正如人們所期望的那樣。