доступ к переменной структуры внутри метода получения в классе С ++
Вопрос
Хорошо, у меня есть что-то подобное в 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
Как мне написать свой геттер или сеттер в этом случае?
Решение
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;
Другие советы
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
, но с одним исключением: public вместо private как доступ по умолчанию для членов и баз.
Не стоит писать геттер / сеттер для каждого поля структуры. Лучшее решение:
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. Второй нужен для 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;
Обратите внимание, что установщик может нуждаться в некоторых корректировках, если структура содержит указатели.