在c ++中处理引用变量

时间:2013-10-13 07:49:40

标签: c++ variables reference local

好吧,所以我在网上看了一下,显然我的问题是我在这里使用变量“val”,当函数关闭时停止存在。不幸的是,我还没有真正找到解决问题的方法。我相信一旦你知道如何解决这个问题很容易解决,但我只是没有这方面的知识。

在这段代码中,注意我正在尝试返回一个unsigned int val。我不能这样做,因为代码需要引用,而不仅仅是变量。我不能简单地回归val,但我不知道该怎么做。

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

感谢您的帮助。

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

3 个答案:

答案 0 :(得分: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的重量。当然,因为在这种情况下,Foo只是一个小int,您只需按值返回。对于某些按大值/非平凡类型返回值的情况,会创建一个临时副本(在没有通过RVO或NRVO复制的情况下);在这些情况下,您可能希望避免按值返回大对象类型。

答案 1 :(得分: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超出范围,则返回什么(可能返回对您可以检测到的某个静态变量的引用,或者抛出异常)

对于这些问题,您需要更多背景信息。

答案 2 :(得分: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 ++ !!),在你的情况下只使用pass by value,就足够了。

编辑:

如果返回变量被强制为引用类型,并且无法避免,则可以将本地变量的生命周期延长到程序的整个存在期间,使其保持静态。

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

return val; 
}

变量val现在是一个静态局部变量,其生命在整个程序中, 所以围绕对这个变量的引用应该没问题,但不推荐编程, 因为按值传递就足以满足您的应用需求。