【问题标题】:Strange result when implementing multiple return statements c++实现多个返回语句时的奇怪结果c ++
【发布时间】:2016-03-03 20:01:11
【问题描述】:

我的应用程序有一个非常奇怪的问题。我正在使用带有 MBED Online IDE 的 STM 开发板 NUCLEO-F411RE。我的函数 myObj() 返回一个对象;返回对象的值被打印到 LCD。

我似乎发现了一些问题,可能与编译器/链接器中的返回值优化有关。 我无法在错误的应用程序代码中解释问题。

当在 myObj() 中添加第二个 return 语句时,开始出现奇怪的行为。 使用单个 return 语句一切正常,因此我怀疑存在一些基本问题。

预期的 LCD 结果:dar LCD 结果不正确:条形

代码sn-ps:

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;
}

【问题讨论】:

  • 欢迎来到 Stack Overflow!请edit您的问题与minimal reproducible exampleSSCCE (Short, Self Contained, Correct Example)
  • 您没有显示足够精确的代码 - 但我没有看到声明的复制构造函数...
  • charStream 可能违反了三规则
  • 至少您需要显示charStream::in() 的定义,并且正如@M.M 所提到的,您的类可能需要定义一些其他函数(例如复制ctor)。
  • @callyalater 函数中的返回次数没有规则。当你有不同的分支返回不同的东西时,这是双重的。在这种情况下没有意义,但它不应该做任何事情。

标签: c++ mbed rvo


【解决方案1】:

通过引入复制构造函数解决。

函数 myObj() 然后使用复制构造函数并返回正确的结果,即使第二次返回活动也是如此(并不是说这将在实际情况中使用,但它强调了在这种情况下如何进行)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2021-03-25
    • 2012-08-08
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多