доступ к структурной переменной внутри геттера в классе С++

Хорошо, у меня есть что-то вроде этого на С++:

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

Как мне написать свой геттер или сеттер в этом случае?


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 Name {}; Name variable; работает нормально. - person ; 31.10.2009
comment
О РЛИ? Боюсь, я не специалист по 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 вместо чего-то, что манипулирует данными, то вам, вероятно, следует отказаться от геттера/сеттера (поскольку вы будете использовать их неправильно) и сделать элемент данных общедоступным.

Кроме того, помните: определение классов с помощью struct работает идентично определению классов с помощью class, но с одним исключением: общедоступный, а не частный доступ по умолчанию для членов и баз.

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

Не рекомендуется писать геттер/сеттер для каждого поля структуры. Лучшее решение:

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