2014-03-27 2 views
1

Мне интересно, что я делаю неправильно здесь. Я создаю класс a и класс b, устанавливая b равным a, устанавливая значение a и печатая это значение b. Но значение b не меняется.C++ Класс: Передайте по ссылке

Вот мой код:

#include <iostream> 
using namespace std; 

struct Node 
{ 
    int x; 
    int y; 
}; 

class Ball 
{ 
public: 
    Ball(); 
    Ball(int r, int x, int y); 

    int GetR(); 
    void SetR(int); 

    int GetX(); 
    void SetX(int); 

    int GetY(); 
    void SetY(int); 

private: 
    int m_r; 
    int m_x; 
    int m_y; 
}; 

int main(int argc, char* argv[]) 
{ 
    Ball a; 
    Ball b; 

    b = a; 

    a.SetR(10); 

    cout << "a.GetR() : " << a.GetR() << endl; 
    cout << "b.GetR() : " << b.GetR() << endl; 

    return 0; 
} 

Ball::Ball() 
{ 
    m_r = 0; 
    m_x = 0; 
    m_y = 0; 
} 

Ball::Ball(int r, int x, int y) 
{ 
    m_r = r; 
    m_x = x; 
    m_y = y; 
} 

int Ball::GetR() 
{ 
    return m_r; 
} 

void Ball::SetR(int r) 
{ 
    m_r = r; 
} 

int Ball::GetX() 
{ 
    return m_x; 
} 

void Ball::SetX(int x) 
{ 
    m_x = x; 
} 

int Ball::GetY() 
{ 
    return m_y; 
} 

void Ball::SetY(int y) 
{ 
    m_y = y; 
} 

Вот мой терминальный вывод:

a.GetR() : 10 
b.GetR() : 0 

Может кто-нибудь объяснить мне, как работает класс прохода по ссылке в C++ и почему это happeneing?

Заранее спасибо.

+0

Добро пожаловать в * значение семантика *. – dyp

+0

Чтобы продемонстрировать свою проблему, не можете ли вы просто сделать код короче? Каким образом относится к классу 'Node' и к ним относятся Set/Get Y/X? –

ответ

1

Назначая Ball b = a;, что она делает это просто создать неглубокую копию объекта. Таким образом, a и b имеют разную выделенную память. Любое изменение свойств в (по значению) не влияет на b.

Ответ необходимо назначить с помощью ссылки:

Ball &b = a; 

Просто некоторые немного больше информация, я хотел бы объяснить подробнее о «мелком» слово, которое я подчеркивал в выше:

class X { 
    int r; 
} 

class A { 
    X *myX; 
} 

class B { 
    X *myB; 
} 

Если я устанавливаю A a; B b =a; тогда a.myX.r = 10; также будет влиять на b.myX.r

Это происходит потому, что объект копирования неглубоко. Он не копирует указатель, указывающий на него, а только сам указатель.

2

Нет, где вы находитесь «мимоходом». Код работает должным образом. Вы создаете объект a и новый объект b. Затем вы меняете r в объекте a. Потому что b - это целый отдельный объект (не подключен к a), r не изменяется. Похоже, что вы пытаетесь создать ссылку на объект a, в котором вы могли бы сделать это:

Ball &b = a; 

Теперь код выведет: b.GetR() : 10

0

Назначая b к a, вы вызывая неявный конструктор копирования для класса Ball:

Ball a; 
Ball b; 
b = a; 

Это делает b полицейский y от a. Если вы хотите сделать b ссылку на a, вы должны изменить тип на Ball&, например, так:

Ball a; 
Ball& b = a; 
0

Ball a; Ball b;

b = a; // элементы данных объекта b будут иметь копию элементов данных объекта a. Элементы данных из двух объектов соединяются вместе (или связаны или вообще). Они имеют свои собственные значения независимо.Когда вы меняете значения элементов данных одного объекта, это изменение не влияет на членов данных другого.

a.SetR (10); // Это изменяет элемент данных объекта a, а не b. Вот почему у вас есть такой результат.

Если вы хотите, чтобы изменения внутри объекта влияли на другие, вам необходимо установить: Ball & b = a;

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