acesso variável struct dentro Setter getter em uma classe C ++
Pergunta
Ok, eu tenho algo parecido com isso em 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
Como devo escrever meu getter ou setter neste caso?
Solução
structName
faz parte do nome do tipo, não o nome da variável. Você precisa dar-lhe um nome, algo como:
struct structName {
int someStructVariable;
int someOtherStructVariable;
} myStructure;
E, em seguida, em seu uso acessor:
return myStructure.someStructVariable;
Isso deve obter o resultado desejado. Outras alternativas para a variável estrutura são para separar a definição da estrutura da declaração de variável:
struct structName {
int someStructVariable;
int someOtherStructVariable;
};
struct structName myStructure;
ou adicionar em typedef
:
typedef struct structName {
int someStructVariable;
int someOtherStructVariable;
} structTypedefName;
structTypedefName myStructure;
Outras dicas
struct A {
A() : _n(0) {}
int get_n() const {
return _n;
}
void calculate(int a) {
_n = a * a * a;
}
private:
int _n;
};
Aqui está um exemplo completo. Se você quer uma set_n
espelho em vez de algo que manipula os dados, então você provavelmente deve soltar o getter / setter (como você estaria usando-los incorretamente) e fazer o público membro de dados.
Além disso, lembre-se: a definição de classes com obras struct
identicamente para a definição de classes com class
mas para uma exceção:. Público em vez de privado como o acesso padrão para os membros e bases
Não é uma boa idéia para escrever um getter / setter para cada campo estrutura. Uma solução melhor é:
typedef struct {
int field1;
int field2;
} structType;
class MyClass {
private:
structType _structName;
public:
const structType & getStructName() const {
return _structName;
}
}
Mantenha structType
e MyClass
separado. Use o getter como:
MyClass m;
int var;
var = m.getStructName().field1;
O primeiro const
é necessária para retornar um valor const. O segundo é necessário para const-correção .
Existem duas maneiras de definir um setter:
class MyClass {
// ...
public:
// type 1
void setStructName(const structType &s) {
_structName = s;
}
// type 2
structType & setStructName() {
return _structName;
}
}
Use o primeiro como:
MyClass m;
structType s;
m.setStructName(s);
A segunda versão permite que você modifique campos de estrutura separados, bem como:
m.setStructName() = s;
m.setStructName().field1 = 10;
Note que o setter pode precisar de alguns ajustes, se a estrutura contém ponteiros.