Cpp обратная ссылка - PullRequest
       1

Cpp обратная ссылка

0 голосов
/ 20 ноября 2011

У меня проблема со следующим кодом:

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

Какой обходной путь для этого?

EDIT

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 ]

4 голосов
/ 20 ноября 2011

Первая ошибка в точности как говорится. Вы возвращаете ссылку на локальную переменную.

result объявлено в стеке. Он умрет после завершения функции, поэтому любые ссылки на него станут недействительными и будут зависать.

Что касается второй ошибки, нам нужно увидеть определение класса IntegerSet, чтобы увидеть, где находится неоднозначность.

РЕДАКТИРОВАТЬ: Вы также должны определить конструктор копирования для вашего класса.

РЕДАКТИРОВАТЬ 2: Хорошо, я думаю, я понял это:

Ваше определение для второго конструктора выглядит примерно так?

IntegerSet::IntegerSet(int a = 0, int b = 0, int c = 0, int d = 0, int e = 0){

}

Я попробовал это, и я получил неоднозначный вызов перегрузки, который вы получили.

В этом случае вызов конструктора без параметров может перейти к любому вызову конструктора - отсюда и неоднозначность. Итак, что вы должны сделать, это избавиться от значения по умолчанию для первого параметра.

3 голосов
/ 20 ноября 2011

Вы не можете вернуть ссылку на локальную переменную. Как только функция завершается, переменная исчезает. Вам необходимо либо вернуть полную копию, либо изменить ее на это и передать переменную «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 голосов
/ 20 ноября 2011

Первая ошибка связана с тем, что, как было сказано, вы возвращаете ссылку на локальную переменную. Рассматривайте ссылку как указатель внизу. То, что вы делаете, хранит ссылку на локальную переменную, что означает переменную в стеке, которая после 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 вы хотите вызвать.

Если вы предоставите больше кода, я мог бы помочь вам лучше определить его.

2 голосов
/ 20 ноября 2011

Проблема с возвращением локальной переменной заключается в том, что она находится в области видимости / действительна только во время выполнения функции, когда функция выполнена, кадр стека отбрасывается, и вы ничего не можете гарантировать относительно значения этой памяти. .

0 голосов
/ 20 ноября 2011

Вы не можете вернуть ссылку на локальную переменную, которая будет уничтожена сразу после выхода из метода. Попробуйте вернуть его по значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...