2016-04-14 9 views
0

В C++, что происходит, когда у меня есть следующиеЧто происходит, когда классы, которые друзья имеют те же переменные Имя пользователя

class House 
{ 
public: 
    House(); 
    ~House(); 

private: 
    int* m_peopleInside; 

friend class Room; 
}; 

, а затем в конструкторе House это установлено

m_peopleInside = new int[5]; 
m_peopleInside[4] = 2; 

и

class Room 
{ 
public: 
    Room(); 
    ~Room(); 

    Update(); 

private: 
    int* m_peopleInside; 
}; 

Then in the Room.Update() Я использую m_peopleInside что-то вроде этого.

&m_peopleInside[4]; 

Это мое понимание, что класс друга позволит классу Room получить доступ к частным членам класса House. Итак, какой m_peopleInside будет использоваться?

Следует добавить, что в этом случае m_peopleInside используется как массив.

+0

это зависит от того, как вы используете 'm_peopleInside'. Пожалуйста, покажите пример кода. – songyuanyao

ответ

2

Это переменная экземпляра. Поэтому для этого нужен экземпляр. Если экземпляр не предоставляется, то он совпадает с this->m_peopleInside, что означает, что он относится к экземпляру, на который была вызвана функция. Так, например, если это ваша функция:

void Room::Update() { 
    // these two are the same, they null the member of the Room object 
    m_peopleInside = nullptr; 
    this->m_peopleInside = nullptr; 

    House h; 
    // should be pretty obvious what this does 
    h.m_peopleInside = nullptr; 
} 
+0

Привет, Спасибо за ответ. Я понимаю ваш ответ, но он меняется в зависимости от того, как он используется? Я добавил больше к моему примеру в вопросе. – unknownSPY

+0

@unknownSPY: он изменяется, если вы поместите другой объект слева от него, с оператором доступа к члену ('.'). Мне не совсем ясно, как вы думаете, что он может получить доступ к переменной члена House (без названия объекта «Дом»). * Какой член * объекта объекта House вы ожидали бы получить? –

+0

Очень хороший вопрос. Могу ли я ответить вам? У меня есть немного кода для написания, но он не полностью связан с вопросом, и его слишком сложно помещать в комментарии. – unknownSPY

1

Это мое понимание, что класс friend позволит классу Room получить доступ к частным членам класса House.

Это правильно.

Какой из них m_peopleInside?

Чтобы получить доступ к m_peopleInside члена в House объекта, вам нужен объект или указатель типа House.

В Room::update(), если вы просто используете m_peopleInside, это будет переменная член Room, не House.

+0

Привет, Спасибо за ответ. Я понимаю ваш ответ, но меняет его в зависимости от того, как он используется? Я добавил еще один пример в вопрос. – unknownSPY

+0

Да. Без объекта «Дом» любое использование 'm_peopleIns ide' inside 'Room :: update' будет переменной-членом' Room', а не 'House'. –

0

При использовании «m_peopleInside» внутри «Room.Update()» вы обязательно использовать элемент данных «Room». Ваше понимание классов «друг» не так корректно. Чтобы было ясно, предположим, что у вас есть объект «x» из класса «House» в одном из методов класса «Комната», например, например «Update()». Затем следующий код верен в этом метод:.

cout << x.m_peopleInside; 

Хотя «m_peopleInside» является частным в «Доме», она доступна из методов комнатных, так как класс «Дом» заявляет, что «номер» является его другим