Zugreifen auf struct Variable innerhalb Getter setter in einer C ++ Klasse
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?
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.