2016-05-31 8 views
0

Warum ist die Methode payment1 geben einen anderen outpout dann payment2? payment2 hat den gleichen Argumentnamen dann den Methodennamen (ich hoffe ich sage das richtig?). Ich meine, dass der Code this->moneysamename+=moneysamename;. Warum kann der Compiler die 2 Variablen nicht unterscheiden?Methode mit dem gleichen Namen wie die Argumente Ergebnisse zu verschiedenen Ausgang

Hier ist der vollständige Code:

#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); 
} 

Ausgang:

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

Kann die Frage nicht verstehen. Bitte geben Sie genaues Problem an - was ist Ihre erwartete Ausgabe (und warum erwarten Sie, dass es so ist). – SergeyA

+0

Warum sind sie "statisch"? –

Antwort

3

Ihr Problem ist, dass Sie nicht die statische Variable in payment2 drucken, sondern drucken Sie die lokalen Funktionsvariablen

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

Da in die obige Zeile, die Sie nicht this-> verwendet haben, wie Sie in

this->moneysamename+= moneysamename; 

erhalten Sie die Funktion lokale moneysamename und nicht die statische Mitgliedsvariable. Ändern Sie den Ausgang in

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

und Sie erhalten die gleiche Ausgabe.

Der Grund, warum Sie dies nicht in payment1 bekommen, ist der Funktionsparameter hat einen anderen Namen als die statische Variable. Hätten Sie die Funktion

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

gemacht, hätten Sie die gleichen Ergebnisse gehabt.

+0

ye einfacher Fehler ... habe das nicht gesehen, danke :) – Rudi

+0

@Rudi Kein Problem. Froh, dass ich Helfen kann. – NathanOliver

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

Hier innen payment2 wird moneysamename beziehen sich immer auf das erste Argument der Funktion von C++ Scoping-Regeln (die nächste Definition ist genommen). Daher wird immer das Argument der Funktion anstelle der statischen geschützten Variablen der Elternklasse mit dem gleichen Namen gedruckt. die lokal Eltern Variable drucken Sie sie gehen ist Umfang von cout << "Worker: " << this->moneysamename << endl;