3 Stimmen

Die Set-Funktionen funktionieren aus irgendeinem Grund nicht.

Ich arbeite an einer einfachen Konsolenanwendung, um eine Methode zur Berechnung von Schlachten zwischen zwei großen Einheiten mittelalterlicher Soldaten zu prototypisieren. Die Idee ist, dass ich die Berechnungen einrichte und das Programm mehrmals mit unterschiedlichen Parametern ausführe, um ein Gefühl dafür zu bekommen und zu sehen, ob es das ist, was ich will. Wie auch immer, zum Problem.

Jede der beiden Einheiten wird durch eine Unit-Klasse dargestellt. Die Klasse enthält Variablen für "Angriff", "Verteidigung", "Taktik" und "Einheitsgröße" sowie einige andere, die ich auskommentiert und ignoriert habe, bis ich dieses Problem behoben habe. Hier ist der Code für den Klassenheader:

#ifndef UNITS_H
#define UNITS_H
#include 
#include 

class Unit
{
  public:
      int attack;
      int defense;
      int charge;
      int brace;
      int tactics;
      int unit_size;

  public:
      bool isAlive;
      std::string name;
      Unit(std::string name_target)
      {
          name = name_target;
          attack = 1;
          defense = 1;
          charge = 1;
          brace = 1;
          tactics = 1;
          unit_size = 1;
          isAlive = true;
      }

      float GetAttack() {return (float)attack;}
      float GetDefense() {return (float)defense;}
      float GetCharge() {return (float)charge;}
      float GetBrace() {return (float)brace;}
      float GetTactics() {return (float)tactics;}
      float GetSize() {return (float)unit_size;}

      void SetAttack(int change) {attack = change;}
      void SetDefense(int change) {defense = change;}
      void SetCharge(int change) {charge = change;}
      void SetBrace(int change) {brace = change;}
      void SetTactics(int change) {tactics = change;}
      void SetSize (int change) {unit_size = change;}

      void TakeCasualties (int casualties);
      int Defend(Unit enemy, float base_chance, float base_multiplier);
      void DisplayStats();

    };

#endif // UNITS_H

Sorry, wenn es schlampig ist, aber ich bin ein bisschen Amateur.

Ich würde den .cpp-Code für die Klasse einbeziehen, aber alles darin funktioniert gut. Ich habe Testläufe nur mit den Standardwerten durchgeführt, ohne Probleme. Das einzige Problem, das ich habe, besteht darin, die Werte nach der Konstruktion zu ändern.

In main.cpp habe ich eine Funktion AssignStats(Unit unit_target), die ich aufrufe, sobald die beiden Units erstellt sind. Ich rufe sie nacheinander auf jede davon. Der Code dafür lautet wie folgt:

void AssignStats (Unit unit_target)
{
    int x;
    cout << unit_target.name << endl;
    cout << "Wert für Angriff?" << endl;
    cin >> x;
    cout << x << endl;
    unit_target.SetAttack(x);

    cout << "Wert für Verteidigung?" << endl;
    cin >> x;
    unit_target.SetDefense(x);

    //unit_target.SetCharge(x);
    //unit_target.SetBrace(x);

    cout << "Wert für Taktik?" << endl;
    cin >> x;
    unit_target.SetTactics(x);

    cout << "Wert für Größe?" << endl;
    cin >> x;
    unit_target.SetSize(x);
}

Soweit ich das beurteilen kann, sollte dieser Code funktionieren. Wenn ich jedoch die Statistiken jeder Einheit danach anzeigen lasse, werden die Standardwerte angezeigt, die vom Konstruktor eingegeben wurden. Ich kann einfach nicht verstehen, warum meine Set-Funktionen nicht funktionieren. Ich habe den Code etwas umgeschrieben, um zu überprüfen, ob sie die Eingabe richtig erhalten, wie folgt:

void Unit::SetAttack()
{
    int x;
    std::cout << "Zielwert für Angriff eingeben." << std::endl;
    std::cin >> x;
    std::cout << x;
    attack = x;
    std::cout << attack;
}

Ich würde 10 eingeben, und jedes der couts zeigt mir sofort 10 zurück, selbst der, der angeblich die Angriffsvariable der Klasse anzeigen sollte. Aber später, als ich DisplayStats() aufrief, zeigte es wieder alle Werte als Standardwerte an.

Kann jemand, der erfahrener ist als ich, das bitte klären?

3voto

Vlad from Moscow Punkte 263567

Ich denke, das Problem ist, dass die Funktion AssignStats das Argument per Wert akzeptiert.

void AssignStats (Unit unit_target);

Dabei wird die Funktion mit einer Kopie des Originalobjekts umgehen. Das Originalobjekt selbst wird nicht verändert.

Ändern Sie es wie folgt

void AssignStats (Unit &unit_target);

0voto

paisanco Punkte 4138

Ich habe deine Set-Funktionen getestet und sie funktionieren einwandfrei. Ich denke, das Problem liegt an:

void AssignStats (Unit unit_target);

Du übergibst den Unit-Parameter als Wert, nicht als Referenz. Dadurch wird eine lokale Kopie des Unit-Objekts erstellt, die mit neuen Parametern initialisiert wird.

Du musst per Referenz aufrufen:

void AssignStats (Unit &unit_target);

Auf diese Weise wird eine Referenz zum Originalobjekt übergeben und deine Zuweisungen der Set()-Funktionen werden darauf funktionieren.

Einige zusätzliche Ratschläge über die Frage hinaus:

In C++ ist es in der Regel besser, Parameter per Referenz anstatt per Wert zu übergeben, da der Overhead durch das Kopieren eines großen Objekts bei der Wertübergabe erheblich sein kann.

Wenn du Setter/Getter-Methoden verwendest, um Parameter festzulegen, sollten diese Parameter als privat oder geschützt deklariert werden, nicht öffentlich. Das ist ein Aspekt der objektorientierten Kapselung - lass nicht zu, dass die Parameter außerhalb des Objekts geändert werden.

Zum Beispiel sollte es heißen:

// oder geschützt, wenn du Unit später unterschichten möchtest
private:
      int attack;
      int defense;
      int charge;
      int brace;
      int tactics;
      int unit_size;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X