Возврат объекта в c ++ по ссылке - PullRequest
0 голосов
/ 28 июня 2019

Я поставил перед собой цель перегрузить operator+ (добавление объектов класса). Оказывается, эту сумму можно просто интерпретировать как сумму двух векторов. Но когда дело доходит до метода operator+, мне трудно вернуть объект. Я читал похожие темы и даже пытался применить некоторые предложения, но, к сожалению, безуспешно. Я прилагаю некоторые из моего кода.

template<class Y>
class myVect {
public:
    myVect(int n = 1);                          
    ~myVect();
    myVect(const myVect& a);                    

    myVect& operator= (const myVect&);
    myVect& operator+ (const myVect&);

    void display(const myVect& a);      

private:
    int size;
    Y* data;
    template<class U> friend class myClass;     
}; 

template<class Y>                               // constructor      
myVect<Y>::myVect(int n) {
    size = n;
    data = new Y[size];
    cout << endl << "Pass the elements" << " " << size << "\n";
    for (int i = 0; i < size; i++) {
        cin >> *(data + i);
    }
}

template <class Y>                             // deconstructor                 
myVect<Y> :: ~myVect() {
    delete[] data;
}



template<class Y>                               // copy constructor
myVect<Y> ::myVect(const myVect & a) {
    size = a.size;
    data = new Y[size];                         

    for (int i = 0; i < size; i++) {
        *(data + i) = *(a.data + i);            
    }
}

template<class Y>                              //ASSIGMENT OPERATOR                                                 
myVect<Y> & myVect<Y> :: operator= (const myVect<Y> & a) {
    if (this != &a) {                                                   
        delete[] data;                                                  
        size = a.size;                                                  
        data = new Y[size];
        for (int i = 0; i < size; i++) {
            *(data + i) = *(a.data + i);
        }
    }
    return *this;
}

Оператор метода + является следующим:

template<class Y>
myVect<Y>& myVect<Y> ::operator+ (const myVect<Y>& a) {
    if (this->size != a.size) {
    cout << endl << "not able to perform that operation - wrong dimensions" << endl;
    }
    else {
        myVect<Y> newObj(this->size);
        for (int i = 0; i < this->size; i++) {
            *(newObj.data + i) = *(this->data + i) + *(a.data + i);
        }
    }
    return newObj;                                                      
}       

Я получаю ошибку 'newObj': идентификатор не найден. Я считаю, что это из-за деконструктора. Я попытался поместить класс myVect в новый класс (инкапсулировать его) и создать метод return, но он ничего не изменил - тип ошибки все тот же. Вы знаете, как решить эту проблему?

В любом случае, если это ошибка деструктора, означает ли это, что newObj удаляется до ее возврата?

Ответы [ 2 ]

5 голосов
/ 28 июня 2019

Проблема может быть уменьшена до этого:

int foo()
{
    if (true)  // In reality, some meaningful condition
    {
       int x = 4;
    }

    return x;
}

Переменная в области для блока if. Это не существует вне этого.

Вы должны будете убрать его декларацию из условного и сделать все остальное, что требуется для этой работы & hellip; или return из внутри условия, и сделать что-то еще (сгенерировать исключение?) в противном случае.

Например, с учетом приведенной выше демонстрации:

int foo()
{
    int x = 0; // Or some other value

    if (true)  // In reality, some meaningful condition
    {
       x = 4;
    }

    return x;
}

или

int foo()
{
    if (true)  // In reality, some meaningful condition
    {
       int x = 4;
       return x;
    }

    throw std::runtime_error("For some reason I have no value to give you!");
}

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

2 голосов
/ 28 июня 2019

Вы объявили свой объект внутри блока, поэтому он не будет существовать во внешней области видимости.Это обычно освобождает вас от повторного использования имен переменных в разных ветвях;попробуйте сделать newObj внутри if части оператора и посмотреть, как не выдает ошибку, например.

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