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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top