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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top