好吧,所以我在网上看了一下,显然我的问题是我在这里使用变量“val”,当函数关闭时停止存在。不幸的是,我还没有真正找到解决问题的方法。我相信一旦你知道如何解决这个问题很容易解决,但我只是没有这方面的知识。
在这段代码中,注意我正在尝试返回一个unsigned int val。我不能这样做,因为代码需要引用,而不仅仅是变量。我不能简单地回归val,但我不知道该怎么做。
http://i.imgur.com/E8sf2aS.png
感谢您的帮助。
编辑:对不起,我的图片有些问题,显然我需要处理我的代表。
答案 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现在是一个静态局部变量,其生命在整个程序中, 所以围绕对这个变量的引用应该没问题,但不推荐编程, 因为按值传递就足以满足您的应用需求。