Frage

Okay, ich habe so etwas wie dies in C ++:

class MyClass{
private:
  int someVariable;
  int someOtherVariable;

  struct structName{
    int someStructVariable;
    int someOtherStructVariable;
  };//end of struct

public:
  //getters & setters for the defined variables.

  int getSomeStructVariable()
  {
    // this does not work I get this error: "error: expected primary-expression
    // before '.' token"
    return structName.someStructVariable;
  } 
};//end of class

Wie soll ich meine Getter oder Setter in diesem Fall schreiben?

War es hilfreich?

Lösung

structName ist Teil des Typname, nicht der Variablenname. Sie müssen ihm einen Namen geben, so etwas wie:

struct structName {
  int someStructVariable;
  int someOtherStructVariable;
} myStructure;

Und dann in Ihrer Accessor Verwendung:

return myStructure.someStructVariable;

Das sollte man das Ergebnis bekommen Sie wollen. Andere Alternativen für die Strukturvariablen sind die Strukturdefinition aus der Variablendeklaration trennen:

struct structName {
  int someStructVariable;
  int someOtherStructVariable;
};

struct structName myStructure;

oder in typedef hinzuzufügen:

typedef struct structName {
  int someStructVariable;
  int someOtherStructVariable;
} structTypedefName;

structTypedefName myStructure;

Andere Tipps

struct A {
  A() : _n(0) {}
  int get_n() const {
    return _n;
  }
  void calculate(int a) {
    _n = a * a * a;
  }
private:
  int _n;
};

Hier ist ein vollständiges Beispiel. Wenn Sie einen Spiegel set_n statt etwas wollen, das die Daten manipuliert, dann sollten Sie wahrscheinlich die Getter / Setter fallen (wie Sie sie falsch verwenden würde) und das Datenelement öffentlich machen.

Denken Sie auch daran: Definition von Klassen mit struct Werken identisch , um Klassen mit class definieren, aber für eine Ausnahme:. Öffentlichkeit statt privaten als Standardzugang für Mitglieder und Basen

Es ist keine gute Idee, einen Getter / Setter für jedes Strukturfeld zu schreiben. Eine bessere Lösung ist:

typedef struct {
    int field1;
    int field2;
} structType;

class MyClass {
private:
    structType _structName;
public:
    const structType & getStructName() const {
        return _structName;
    }
}

Halten Sie structType und MyClass getrennt. Verwenden Sie die Getter als:

MyClass m;
int var;
var = m.getStructName().field1;

Der erste const benötigt wird, um einen konstanten Wert zurückzukehren. Die zweite ist erforderlich für const-Korrektheit .

Es gibt zwei Möglichkeiten, um einen Setter zu definieren:

class MyClass {
// ...
public:
    // type 1
    void setStructName(const structType &s) {
        _structName = s;
    }
    // type 2
    structType & setStructName() {
        return _structName;
    }
}

Mit dem ersten als:

MyClass m;
structType s;
m.setStructName(s);

Die zweite Version ermöglicht es Ihnen, getrennte Strukturfelder als auch zu ändern:

m.setStructName() = s;
m.setStructName().field1 = 10;

Beachten Sie, dass die Setter könnten einige Anpassungen benötigen, wenn die Struktur enthält Zeiger.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top