2016-03-03 16 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,正如人们所期望的那样。