Cpp返回参考

时间:2011-11-19 21:57:17

标签: c++ reference

我遇到以下代码的问题:

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;
}

错误是:

  • 调用重载'IntegerSet()'是不明确的

5 个答案:

答案 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 intint,因此无法理解您要调用的两个func中的哪一个。

如果您提供更多代码,我可以帮助您更好地确定代码。

答案 4 :(得分:0)

您不能返回对离开方法后将被销毁的局部变量的引用。尝试按值返回。