C++ 在c+中处理参考变量+;

C++ 在c+中处理参考变量+;,c++,variables,reference,local,C++,Variables,Reference,Local,好的,我已经在网上查看了一下,很明显我的问题是,我在这里使用了一个变量“val”,当函数关闭时它就停止存在了。不幸的是,我在这里还没有找到任何实际的解决办法。我相信这是一个很容易的问题,一旦你知道如何解决,但我只是没有知识 在这段代码中,请注意我试图返回一个无符号的int-val。我不能这样做,因为代码需要一个引用,而不仅仅是一个变量。我不能简单地返回val,但我不知道该怎么做 谢谢你的帮助 编辑:对不起,我在图片上遇到了一些问题,显然我需要处理我的代表。我要大胆猜测一下 Foo& d

好的,我已经在网上查看了一下,很明显我的问题是,我在这里使用了一个变量“val”,当函数关闭时它就停止存在了。不幸的是,我在这里还没有找到任何实际的解决办法。我相信这是一个很容易的问题,一旦你知道如何解决,但我只是没有知识

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

谢谢你的帮助


编辑:对不起,我在图片上遇到了一些问题,显然我需要处理我的代表。

我要大胆猜测一下

Foo& doStuff()
{
    // blah blah
    Foo val;
    // ...
    return val;
    // val is no longer valid end of scope. Returning invalid reference.
}
要么将结果
Foo
实例传递给doStuff,要么在堆上创建一个
new
Foo并作为指针返回

所以

当然,您可以按值返回:

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

取决于食物的重量。当然,因为在本例中,
Foo
只是一个小的
int
只需按值返回即可。对于大型/非普通类型按值返回的某些情况,会创建一个临时副本(在没有通过RVO或NRVO进行复制省略的情况下);在这些情况下,您可能希望避免按值返回大型对象类型。

我将做一个粗略的猜测

Foo& doStuff()
{
    // blah blah
    Foo val;
    // ...
    return val;
    // val is no longer valid end of scope. Returning invalid reference.
}
要么将结果
Foo
实例传递给doStuff,要么在堆上创建一个
new
Foo并作为指针返回

所以

当然,您可以按值返回:

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

取决于食物的重量。当然,因为在本例中,
Foo
只是一个小的
int
只需按值返回即可。对于大型/非普通类型按值返回的某些情况,会创建一个临时副本(在没有通过RVO或NRVO进行复制省略的情况下);在这些情况下,您可能希望避免按值返回大型对象类型。

我将做一个粗略的猜测

Foo& doStuff()
{
    // blah blah
    Foo val;
    // ...
    return val;
    // val is no longer valid end of scope. Returning invalid reference.
}
要么将结果
Foo
实例传递给doStuff,要么在堆上创建一个
new
Foo并作为指针返回

所以

当然,您可以按值返回:

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

取决于食物的重量。当然,因为在本例中,
Foo
只是一个小的
int
只需按值返回即可。对于大型/非普通类型按值返回的某些情况,会创建一个临时副本(在没有通过RVO或NRVO进行复制省略的情况下);在这些情况下,您可能希望避免按值返回大型对象类型。

我将做一个粗略的猜测

Foo& doStuff()
{
    // blah blah
    Foo val;
    // ...
    return val;
    // val is no longer valid end of scope. Returning invalid reference.
}
要么将结果
Foo
实例传递给doStuff,要么在堆上创建一个
new
Foo并作为指针返回

所以

当然,您可以按值返回:

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

取决于食物的重量。当然,因为在本例中,
Foo
只是一个小的
int
只需按值返回即可。对于大型/非普通类型按值返回的某些情况,会创建一个临时副本(在没有通过RVO或NRVO进行复制省略的情况下);在这些情况下,您可能希望避免按值返回大型对象类型。

此代码除了在图像中给出外,还有很多问题(!!!)

我猜你是想在列表中找到位置
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 ???;
}
const unsigned int&list::operator[](unsigned int pos)const
{
节点*n1=?,*n2=???;
for(无符号整数k=0;k<\u size;k++)
{
如果(k==pos)
返回n2->value;
n1=n2->next;
n2=n1;
}
返回???;
}
其他问题仍然存在,例如:

  • 为什么需要两个
    节点*
    而不是一个(直接查找位置
    pos-1

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

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


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

除了在图像中给出之外,此代码还有很多问题(!!!)

我猜你是想在列表中找到位置
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 ???;
}
const unsigned int&list::operator[](unsigned int pos)const
{
节点*n1=?,*n2=???;
for(无符号整数k=0;k<\u size;k++)
{
如果(k==pos)
返回n2->value;
n1=n2->next;
n2=n1;
}
返回???;
}
其他问题仍然存在,例如:

  • 为什么需要两个
    节点*
    而不是一个(直接查找位置
    pos-1

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

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


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

此代码除了给出