2015-06-09 3 views
-1

Мне нужно преобразовать из одной структуры в другую с похожими переменными. Я тестирую это на примере двух структур, которые имеют два ints.Как конфертировать из одной структуры в другую структуру?

По какой-то причине он не присваивается правильно, я считаю, что он отправляет локальную копию, которая затем освобождается? Что я делаю не так?

Спасибо!

#include <iostream> 
using namespace std; 


struct a 
{ 
    int x, y; 

    a(){} 

    a(int _x, int _y) 
    { 
     x = _x; 
     y = _y; 
    } 
}; 

struct b 
{ 
    int x, y; 

    b(){} 

    b(int _x, int _y) 
    { 
     x = _x; 
     y = _y; 
    } 

    b& operator=(const a& _a) 
    { 
     return b(_a.x, _a.y); 
    } 
}; 



int main() 
{ 
    a a_test(1,2); 
    b b_test; 

    b_test = a_test; 

    std::cout << "a: " << a_test.x << "," << a_test.y << endl; 
    std::cout << "b: " << b_test.x << "," << b_test.y << endl; 
    return 0; 
} 

ответ

3
b& operator=(const a& _a) 
    { 
     return b(_a.x, _a.y); 
    } 

Вы создаете локальную копию б и возвращает ссылку на него. Эта локальная копия будет уничтожена в конце области действия.

То, что вы, вероятно, хотели сделать:

b& operator=(const a& _a) 
{ 
    x = _a.x; 
    y = _a.y; 
    return *this; 
} 

Точка оператора присваивания, чтобы присвоить новое значение к существующему объекту. Это функция-член, поэтому он имеет прямой доступ к внутренним объектам. Таким образом, вы можете просто изменить его членов и вернуть ссылку на себя, чтобы включить дальнейшие изменения.

Редактировать решить вопрос в комментариях, как сделать то же самое для class a:

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

В заголовке

class b; 

struct a 
{ 
    int x, y; 

    a(){} 

    a(int _x, int _y) 
    { 
     x = _x; 
     y = _y; 
    } 

    a& operator=(const b& _b); 
}; 

В CPP

a& a::operator=(const b& _b) 
{ 
    x = _b.x; 
    y = _b.y; 
    return *this; 
} 
+0

Быстрый вопрос. Как я буду делать то же самое для struct a (поскольку пока не было объявления b)? Danke! – user2122589

+1

@ user2122589 Я отредактировал ответ с ответом на ваш вопрос. – rozina

Смежные вопросы