我的申请有一个非常奇怪的问题。我正在使用STM开发板NUCLEO-F411RE和MBED在线IDE。我的函数myObj()返回一个对象;返回的对象的值将打印到LCD上。
我似乎发现了一些问题,可能是编译器/链接器中的返回值优化。 我无法用错误的应用程序代码解释这个问题。
在myObj()中添加第二个return语句时,会出现奇怪的行为。 使用单个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;
}
答案 0 :(得分:1)
通过引入复制构造函数来解决。
函数myObj()然后使用copy-constructor并返回正确的结果,即使第二个返回处于活动状态(不是这将在实际情况中使用,但它强调了在这种情况下如何处理)。 / p>
charStream &charStream::operator=(const charStream ©) {
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 。