2016-11-17 6 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; 
} 

このコード(私の問題を説明するために簡略化)では、Personのお金を増やすためにCompany内のメンバー変数moneyにアクセスします。しかし、p.money + = amountはローカルでのみ動作するように見え、メインの特定の人の金額は変更されません。他のクラス内のメンバー変数にアクセスして変更する

この作品を制作するにはどうすればよいですか?お金を保護されたメンバー変数にすることは可能でしょうか?

+0

Googleは呼び出しによる参照と呼び出しによる呼び出しを行います。 –

+0

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

+0

あなたの質問に答えるには、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; } 

あなたはまた、修飾子constとメンバ関数get_moneyを宣言した方がよい

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

を書くことができます。この場合、クラスPersonの定数オブジェクトに使用できます。

int get_money() const {return money; } 
+0

実際には、パブリック 'set_money'ではなく、' pay_money(int amount){this-> money + = amount;} 'を返すようにします。 –

+0

@MartinBonner関数に名前を付けることができます:)あなたが好きなようにそれを定義しました。:)将来的にクラスを拡大できることを考慮してください。知るか? –

関連する問題