достъп до struct променлива вътре в getter setter в c++ клас

Добре, имам нещо подобно в 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

Как трябва да напиша моя getter или setter в този случай?


person Asad Khan    schedule 30.10.2009    source източник


Отговори (3)


structName е част от името на типа, а не името на променливата. Трябва да му дадете име, нещо като:

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

И след това във вашия аксесоар използвайте:

return myStructure.someStructVariable;

Това трябва да ви осигури желания резултат. Други алтернативи за структурната променлива са да се отдели дефиницията на структурата от декларацията на променливата:

struct structName {
  int someStructVariable;
  int someOtherStructVariable;
};

struct structName myStructure;

или да добавите в typedef:

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

structTypedefName myStructure;
person Carl Norum    schedule 30.10.2009
comment
Няма нужда typedef да изпуска struct class-key, struct Name {}; Name variable; работи добре. - person ; 31.10.2009
comment
O RLY? Страхувам се, че не съм C++ човек. C определено изисква typedef. Предполагам, че има смисъл; C++ също не изисква ключовата дума class да присъства, когато декларирате екземпляри. - person Carl Norum; 31.10.2009

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

Ето един пълен пример. Ако искате огледало set_n вместо нещо, което манипулира данните, тогава вероятно трябва да изпуснете getter/setter (тъй като ще ги използвате неправилно) и да направите члена на данните публичен.

Освен това запомнете: дефинирането на класове с struct работи идентично с дефинирането на класове с class, но с едно изключение: публичен вместо частен като достъп по подразбиране за членове и бази.

person Community    schedule 30.10.2009
comment
Сега, когато някой любезно редактира кода, виждам, че съм прочел проблема погрешно. (D'oh.) Така или иначе ще оставя отговора. - person ; 31.10.2009

Не е добра идея да се пише getter/setter за всяко структурно поле. По-добро решение е:

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

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

Съхранявайте structType и MyClass отделно. Използвайте инструмента за получаване като:

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

Първото const е необходимо за връщане на постоянна стойност. Вторият е необходим за const-correctness.

Има два начина за дефиниране на сетер:

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

Използвайте първия като:

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

Втората версия ви позволява да променяте и отделни структурни полета:

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

Имайте предвид, че настройката може да се нуждае от някои корекции, ако структурата съдържа указатели.

person HanT    schedule 11.03.2019