2016-03-29 9 views
0

So habe ich dieses Stück Code für ein Dart-Spiel, in meiner Header-Datei:Weird-Ausgang mit Klasse Getter Funktion C++

class Player 
    { 
    private: 
     string playerName; 
     int bullAccuracy; 
     int outerAccuracy; 
     int singleAccuracy; 
    public: 

     //getters 
     string& getName(); 
     int& getBullAccuracy(); 
     int& getSingleAccuracy(); 

     //setters 
     void setName(string& name); 
     void setBullAccuracy(int& bull_accuracy); 
     void setSingleAccuracy(int& single_accuracy); 
    }; 

Und dann die entsprechenden Getter und Setter-Funktionen in der CPP-Datei sieht wie folgt aus :

All dies sehr einfach und grundlegende Getter/Setter-Code für eine Klasse Daten Mitglieder, nicht wahr?

In der main() -Funktion habe ich jedoch die Namen für meine Spieler, ihre verschiedenen Genauigkeiten, und zeige sie dann über die Getter. Alle diese werden unter Verwendung von Vektoren von Objekten und Iteratoren getan, wie folgt aus:

vector<Player> player(2); 
vector<Player>::iterator modIter; 
int bAccuracy, sAccuracy; 
string playerName; 
cout << "Input the name of the players: " << endl; 
for (modIter = player.begin(); modIter != player.end(); modIter++) 
{ 
    cin >> playerName; 
    modIter->setName(playerName); 
} 
cout << "\nSet the players' bull accuracy:" << endl; 
for (modIter = player.begin(); modIter != player.end(); modIter++) 
{ 
    cout << modIter->getName() << ": "; 
    cin >> bAccuracy; 
    modIter->setBullAccuracy(bAccuracy); 
} 
cout << "\nSet the players' single hit accuracy: " << endl; 
for (modIter = player.begin(); modIter != player.end(); modIter++) 
{ 
    cout << modIter->getName() << ": "; 
    cin >> sAccuracy; 
    modIter->setBullAccuracy(sAccuracy); 
} 
//display values to check program working well so far 
for (modIter = player.begin(); modIter != player.end(); modIter++) 
{ 
    cout << modIter->getBullAccuracy() << endl; 
    cout << modIter->getOuterAccuracy() << endl; 
    cout << modIter->getSingleAccuracy() << endl; 
} 

und nach dem Code ausgeführt wird, und die Eingabe in der Eingabe „Joe“ und „Sid“ für die Namen, 71 und 73 jeweils für Stier Genauigkeit und dann 80 für beide Spieler für die einzelnen Treffergenauigkeit, das ist, was meine Konsole Ausgänge:

Geben Sie den Namen der Spieler:

Joe

Sid

Stellen Sie den Stier Genauigkeit des Spielers:

Joe: 71

Sid: 73 // dies bedeutet, dass zumindest die Namen richtig eingestellt wurden

Stellen Sie die einzelnen Treffergenauigkeit des Spielers:

Joe: Sid 80

: 80

// und hier ist der seltsame Ausgang

80 // dies soll 71

-842150451 // und diese 80

80 // hier sein die 73

-842150451 // und hier wieder 80

So was genau passiert ist, weil dies eine grundlegende und vertraute Verwendung von Gettern und Settern ist, und ich habe keine Ahnung, wie ich das selbst beheben kann, da ich das Problem nicht sehe. Gibt es etwas in meinem Code, das ich nicht sehen kann und das die Ergebnisse verändert?

Vielen Dank im Voraus für Ihre Hilfe

+0

akzeptieren Sie die folgende Antwort. Es wird helfen, einige Punkte für Sie beide zu bekommen. – Guru

Antwort

6

Wenn Sie für einzelne Genauigkeit veranlassen, sind Sie immer noch setBullAccuracy Methode aufrufen, nicht setSingleAccuracy. Sie haben auch Ihre Mitgliedsvariablen nicht initialisiert, weshalb der Ausdruck singleAccuracy Ihnen Unsinn beschert.

+0

Mein Gott, danke. Das habe ich nicht gesehen. Eine kurze Frage, aus Neugierde, seit du die Initialisierung erwähnt hast. Wenn mein Code von Anfang an korrekt war, warum sollte ich die Membervariablen initialisieren? Erhalten sie nicht den Wert, den ich eingegeben habe, und zähle das als Initialisierung? –

+0

Wenn Sie niemals ein Klassenmitglied oder eine lokale Variable setzen, wird es nicht initialisiert, was bedeutet, dass es zufälligen Müll enthält. Der Compiler wird es nicht auf 0 setzen, wenn Sie es nicht sagen. *** Würden sie nicht den Wert erhalten, den ich eingegeben habe, und das als Initialisierung zählen? *** Ja, wenn Sie die korrekte Funktion 'singleAccuracy' verwendet hätten, wäre sie initialisiert worden. Obwohl ich einen Konstruktor bereitgestellt und alle Ganzzahlen auf 0 oder einen anderen Sentinel-Wert initialisiert hätte. – drescherjm

+0

Ja, danke. –

Verwandte Themen