0

好的,所以我在网上环顾四周,很明显我的问题是我在这里使用了一个变量“val”,当函数关闭时它不再存在。不幸的是,我在这里还没有真正找到解决我的问题的任何实际解决方案。我敢肯定,一旦您知道如何解决,这是一个很容易解决的问题,但是我只是没有知识。

在这段代码中,请注意我试图返回一个无符号整数值。我不能这样做,因为代码需要一个引用,而不仅仅是一个变量。我不能简单地返回 val 但我不知道该怎么做。

http://i.imgur.com/E8sf2aS.png

谢谢您的帮助。

编辑:对不起,我的图像有一些问题,显然我需要处理我的代表。

4

3 回答 3

1

这段代码有很多问题,除了在图像中给出(!!!)

我猜你正在尝试pos-1在列表中的位置找到元素,或者其他东西。提到您的问题的主要问题似乎是您首先val按值分配,然后您没有参考返回。您应该n2->value直接返回,这应该是对 的引用unsigned int,如下所示:

const unsigned int &list::operator[](unsigned int pos) const
{
    node *n1 = ???, *n2 = ???;

    for (unsigned int k = 0; k < _size; k++)
    {
        if (k == pos)
            return n2->value;

        n1 = n2->next;
        n2 = n1;
    }

    return ???;
}

其他问题仍然存在,例如

  • 为什么你需要两个node*而不是一个(pos-1直接找位置)

  • 如何初始化n1, n2(以某种方式指向列表的头部;显然new node()不应该工作)

  • 如果输入参数pos超出范围,则返回什么(可能返回对您可以检测到的某个静态变量的引用,或者抛出异常)

对于这些问题,您需要更多的上下文。

于 2013-10-13T08:52:36.257 回答
1

我要大胆猜测一下。

Foo& doStuff()
{
    // blah blah
    Foo val;
    // ...
    return val;
    // val is no longer valid end of scope. Returning invalid reference.
}

要么将结果Foo实例传递给 doStuff,要么new在堆上创建一个 Foo 并作为指针返回。

所以,

void doStuff(Foo& val)
{
    // blah blah
    // ...
    val = x;
}

或者

Foo* doStuff()
{
    // blah blah
    Foo* val = new Foo;  // dont forget to delete
    // ...
    return val;
}

当然也可以按值返回:

Foo doStuff()
{
    // blah blah
    Foo val;
    // ...
    return val;
}

取决于 Foo 的重量。当然,由于在这种情况下 aFoo只是一个小的int你应该简单地按值返回。对于大型/非平凡类型的某些按值返回的情况,会创建一个临时副本(在那些没有通过 RVO 或 NRVO 进行复制省略的情况下);在这些情况下,您可能希望避免按值返回大型对象类型。

于 2013-10-13T07:54:18.427 回答
1

引用变量只有在“引用”的对象存在于内存中时才有效。传递对超出范围变量的引用被认为是未定义的行为。这是您的代码中的错误。请更正。

const unsigned int& list::operator[] (unsigned int pos)const
{
const unsigned int val = 0;

return val; //this is a local variable, whose scope ends here, a reference to this should not be returned
}

这是编译器对您的代码的警告。

warning: reference to local variable ‘val’ returned [enabled by default]

请听编译器警告(尤其是 c/c++ !!),在您的情况下,仅使用按值传递就足够了。

编辑:

如果返回变量被强制为引用类型,并且无法避免,则可以通过将其设为静态来延长局部变量的生命周期,直至程序的整个存在。

const unsigned int& list::operator[] (unsigned int pos)const
{
static const unsigned int val = 0;

return val; 
}

变量 val 现在是一个静态局部变量,它的生命周期贯穿整个程序,因此传递对该变量的引用应该没问题,但不推荐编程,因为按值传递就足以满足您的应用程序的需要。

于 2013-10-13T08:57:33.387 回答