2016-05-31 10 views
0

payment1のメソッドが異なる出力を与えるのはなぜですかpayment2payment2はメソッド名と同じ引数名を持っています(私はこれを言っていますか?)。私はコードthis->moneysamename+=moneysamename;を意味します。コンパイラが2つの変数を区別できないのはなぜですか?ここで引数と同じ名前のメソッドは異なる出力になります

は完全なコードです:

#include <iostream> 
using namespace std; 

class Person 
{ 
    protected: 
     static int money; 
     static int moneysamename; 
public: 
    virtual void payment1(float money1) = 0; 
    virtual void payment2(float moneysamename) = 0; 
}; 

class Worker : public Person 
{ 
public: 
    virtual void payment1(float moneyanothername) 
    { 
     this->money+= moneyanothername; 
     cout << "Worker: " << money << endl; 
    }; 

    virtual void payment2(float moneysamename) 
    { 
     this->moneysamename+= moneysamename; 
     cout << "Worker: " << moneysamename << endl; 
    }; 
}; 

void pay1(Person &m, float sum) 
{ 
    m.payment1(sum); 
} 

void pay2(Person &m, float sum) 
{ 
    m.payment2(sum); 
} 

int Person::money = 0; 
int Person::moneysamename = 0; 

int main() 
{ 
    Worker Gaston; 

    pay1(Gaston, 200); 
    pay1(Gaston, 300); 

    pay2(Gaston, 200); 
    pay2(Gaston, 300); 
} 

は出力:payment2内部ここ

Worker: 200 
Worker: 500 
Worker: 200 
Worker: 300 
+2

質問を理解できません。正確な問題を述べてください - あなたの期待される成果は何ですか?(なぜそうであると思いますか?) – SergeyA

+0

なぜ彼らは '静的'ですか? –

答えて

3

あなたの問題あなたはpayment2で静的変数を印刷されるのではなく、あなたがでているので、ローカル関数の変数

cout << "Worker: " << moneysamename << endl; 

を印刷しているであることにより、スコープがありますあなたはそれに行かなければならローカル親の変数を印刷するにはあなたは

this->moneysamename+= moneysamename; 

で行うようにあなたがthis->を使用しなかった上記の行は、あなたが機能を得るmoneysamenameローカルおよび静的ではありませんメンバー変数。出力を

cout << "Worker: " << this->moneysamename << endl; 

に変更すると、同じ出力が得られます。

これをpayment1に入れない理由は、関数のパラメータが静的変数とは異なる名前になっているためです。あなたが関数を作っていたのですか?

virtual void payment1(float money) 
{ 
    this->money+= money; 
    cout << "Worker: " << money << endl; 
}; 

同じ結果が出たでしょう。

+0

あなたは簡単な間違い...それを見ていない、ありがとう:) – Rudi

+0

@ルディ問題はありません。喜んで助けてください。 – NathanOliver

2
virtual void payment2(float moneysamename) 
{ 
    this->moneysamename+= moneysamename; 
    cout << "Worker: " << moneysamename << endl; 
}; 

moneysamenameは常にC++のスコープ規則によって関数の最初の引数を参照します(最寄りの定義があります撮影)。したがって、関数の引数は常に同じ名前の親クラスの静的保護された変数の代わりに出力されます。 はcout << "Worker: " << this->moneysamename << endl;

関連する問題