我遇到以下代码的问题:
IntegerSet& IntegerSet::unionOfIntegerSets(IntegerSet a){
IntegerSet result;
for (int i = 0; i < 100; i++){
if ((array[i] == 1) || (a.getElement(i) == 1)){
result.setElement(i, 1);
}
}
return result;
}
错误是:
对本地变量'result'的引用返回[默认启用]
调用重载的'IntegerSet()'是不明确的
标题文件:
#ifndef INTEGERSET_H_
#define INTEGERSET_H_
class IntegerSet{
private:
int* array;
public:
IntegerSet();
IntegerSet(int, int, int, int, int);
~IntegerSet();
int getElement(int);
void setElement(int, int);
IntegerSet& unionOfIntegerSets(IntegerSet);
IntegerSet insertionOfIntegerSets(IntegerSet);
void setPrint();
};
#endif
这是什么解决方法?
修改
IntegerSet IntegerSet::unionOfIntegerSets(IntegerSet a){
IntegerSet result;
for (int i = 0; i < 100; i++){
if ((array[i] == 1) || (a.getElement(i) == 1)){
result.setElement(i, 1);
}
}
return result;
}
错误是:
答案 0 :(得分:4)
第一个错误就像它说的那样。您正在返回对局部变量的引用。
在堆栈上声明了 result
。它会在函数结束后死亡,因此无论对它的引用都会变得无效和悬空。
至于第二个错误,我们需要查看IntegerSet
类的定义,以查看歧义的位置。
编辑:您还应该为您的班级定义一个复制构造函数。
编辑2:好的,我想我弄清楚了:
第二个构造函数的定义是否与此类似?
IntegerSet::IntegerSet(int a = 0, int b = 0, int c = 0, int d = 0, int e = 0){
}
我尝试了这个,但我得到了一个模糊的超载调用。
在这种情况下,调用没有参数的构造函数可以进入构造函数调用 - 因此存在歧义。所以你应该做的就是摆脱第一个参数的默认值。
答案 1 :(得分:3)
您无法返回对局部变量的引用。一旦函数结束,变量就消失了。您需要返回完整副本或将其更改为此并通过引用函数传递变量“result”。
void IntegerSet::unionOfIntegerSets(IntegerSet a, IntegerSet &result){
for (int i = 0; i < 100; i++){
if ((array[i] == 1) || (a.getElement(i) == 1)){
result.setElement(i, 1);
}
}
}
答案 2 :(得分:2)
返回局部变量的问题在于它在函数执行期间仅在范围/有效中,当函数完成时,堆栈帧被丢弃并且您无法保证该内存的值的任何内容
答案 3 :(得分:2)
第一个错误是因为,正如它所说,您将返回对局部变量的引用。将引用视为下面的指针,您正在做的是保持对局部变量的引用,这意味着在unionOfIntegerSets
完成它死亡之后堆栈上的变量。所以,编译器会告诉你不要这样做,这对你很有帮助。
如果您有中间结果,则需要复制这些结果,这意味着您的返回值应为IntegerSet
类型,而不是IntegerSet &
您的第二个错误是因为您有其他具有相同名称的功能,而您正在从其他地方调用它。调用函数时传递的参数类型可以转换为至少两个函数重载,这就是编译器无法理解您真正意味着哪两个(或更多)函数的原因。既然你没有给出任何代码,我会举个例子:
int func(short int a);
int func(int a);
现在,如果你打电话:
char c = 'c';
int res = func(c);
C ++可以将char
投射到short int
和int
,因此无法理解您要调用的两个func
中的哪一个。
如果您提供更多代码,我可以帮助您更好地确定代码。
答案 4 :(得分:0)
您不能返回对离开方法后将被销毁的局部变量的引用。尝试按值返回。