Accéder à la variable struct dans le getter setter dans une classe c ++
Question
D'accord, j'ai quelque chose comme ça en 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
Comment dois-je écrire mon getter ou mon setter dans ce cas?
La solution
structName
fait partie du nom du type, pas du nom de la variable. Vous devez lui donner un nom, quelque chose comme:
struct structName {
int someStructVariable;
int someOtherStructVariable;
} myStructure;
Et ensuite, dans votre accesseur, utilisez:
return myStructure.someStructVariable;
Cela devrait vous permettre d'obtenir le résultat souhaité. D'autres alternatives pour la variable de structure consistent à séparer la définition de la structure de la déclaration de variable:
struct structName {
int someStructVariable;
int someOtherStructVariable;
};
struct structName myStructure;
ou pour ajouter typedef
:
typedef struct structName {
int someStructVariable;
int someOtherStructVariable;
} structTypedefName;
structTypedefName myStructure;
Autres conseils
struct A {
A() : _n(0) {}
int get_n() const {
return _n;
}
void calculate(int a) {
_n = a * a * a;
}
private:
int _n;
};
Voici un exemple complet. Si vous voulez un set_n
miroir au lieu de quelque chose qui manipule les données, vous devriez probablement supprimer le getter / setter (car vous ne les utiliseriez pas correctement) et rendre public le membre de données.
De plus, rappelez-vous: la définition de classes avec struct
fonctionne de la même manière que pour définir des classes avec classe
mais pour une exception: public au lieu de privé en tant que accès par défaut pour les membres et les bases.
Ce n’est pas une bonne idée d’écrire un getter / setter pour chaque champ de structure. Une meilleure solution est:
typedef struct {
int field1;
int field2;
} structType;
class MyClass {
private:
structType _structName;
public:
const structType & getStructName() const {
return _structName;
}
}
Conservez structType
et MyClass
séparément. Utilisez le getter comme:
MyClass m;
int var;
var = m.getStructName().field1;
Le premier const
est nécessaire pour renvoyer une valeur const. Le second est nécessaire pour const-correctness .
Il existe deux manières de définir un séparateur:
class MyClass {
// ...
public:
// type 1
void setStructName(const structType &s) {
_structName = s;
}
// type 2
structType & setStructName() {
return _structName;
}
}
Utilisez le premier comme:
MyClass m;
structType s;
m.setStructName(s);
La deuxième version vous permet de modifier également des champs de structure distincts:
m.setStructName() = s;
m.setStructName().field1 = 10;
Notez que le configurateur peut avoir besoin de quelques ajustements si la structure contient des pointeurs.