2016-11-17 1 views
1
#include <iostream> 
#include <string>  
using namespace std; 

class Person 
{ 
private: 
    string name; 
public: 
    Person(string _name, int _money) : name(_name), money(_money) {} 
    int money; 
    int get_money() {return money; } 
}; 

class Company 
{ 
private: 
    string name; 
public: 
    Company(string _name) : name(_name) {} 
    void pay_salary(Person p, int amount); 
}; 

void Company::pay_salary(Person p, int amount) 
{ 
    p.money += amount; 
} 

int main() 
{ 
    Person bob("Bob", 0); 
    Company c("C"); 

    cout << bob.get_money() << endl; // prints 0 
    c.pay_salary(bob,100); 
    cout << bob.get_money() << endl; // prints 0 

    return 0; 
} 

В этом коде (упрощенном иллюстрировании моей проблемы) Я хочу получить доступ к переменной-члену-члену внутри компании, чтобы увеличить деньги Лица. Однако, p.money + = количество, похоже, работает только локально и не изменяет стоимость денег для конкретного человека в основном.Доступ к изменяющейся переменной элемента в другом классе

Каковы некоторые методы выполнения этой работы? Можно ли сделать деньги защищенной переменной-членом?

+0

Google для звонков по ссылке и по телефону! –

+0

'void Company :: pay_salary (Person & p, int amount)' – stark

+0

Чтобы ответить на ваш вопрос: измените 'void Company :: pay_salary (Person p, int amount)' на 'void Company :: pay_salary (Person & p, int amount) '. И для прототипа, конечно, то же самое. –

ответ

3

Функция должна принимать объект по ссылке

void pay_salary(Person &p, int amount); 
       ^^^^^^^^^ 

В противном случае функция связана с копией объекта типа Person.

Вы можете сделать элемент данных money приватным или защищенным (при условии, что класс не является окончательным классом), но вы должны определить аксессор, который изменит объект.

Например

void set_money(int money) {this->money = money; } 

В этом случае вы также можете написать

void Company::pay_salary(Person &p, int amount) 
{ 
    p.set_money(p.get_money() + amount); 
} 

Лучше объявить функцию члена get_money с классификатором const. В этом случае он может использоваться для постоянных объектов класса Person.

+0

На самом деле, вместо публичного 'set_money', у меня будет публичный' pay_money (int amount) {this-> money + = amount;} ' –

+0

@MartinBonner Вы можете назвать функцию и определил его как вам нравится. :) Учтите, что класс может быть увеличен в будущем. Кто знает? –

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