У меня очень странная проблема с моим приложением. Я использую STM Development board NUCLEO-F411RE с MBED Online IDE. Моя функция myObj() возвращает объект; значение возвращаемого объекта печатается на ЖК-дисплее.Странный результат при реализации нескольких операторов возврата C++
Кажется, я идентифицирую некоторую проблему, возможно, с Оптимизацией возвращаемого значения в компиляторе/компоновщике. Я не могу объяснить проблему в неправильном коде приложения.
При добавлении второго оператора return в myObj() начинает происходить странное поведение. С одним оператором возврата все работает отлично, поэтому я подозреваю какую-то фундаментальную проблему.
Ожидаемый результат 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;
}
Добро пожаловать в переполнение стека! Пожалуйста, ** ** [изменить] ** ваш вопрос с помощью [mcve] или [SSCCE (Short, Self Contained, Correct Example)] (http://sscce.org) – NathanOliver
У вас недостаточно кода, чтобы быть точным - но Я не вижу, что конструктор копирования объявлен ... –
'charStream', вероятно, имеет право на нарушение правил. –