在c ++类中访问getter setter中的struct变量

时间:2009-10-30 20:51:17

标签: c++ struct setter getter

好的,我在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?

3 个答案:

答案 0 :(得分:9)

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;

答案 1 :(得分:1)

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的类但是有一个例外:public而不是private作为成员和库的默认访问权限

答案 2 :(得分:0)

为每个结构字段编写一个getter / setter方法不是一个好主意。更好的解决方案是:

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

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

保持structTypeMyClass分开。将吸气剂用作:

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

需要第一个const返回const值。 const-correctness需要第二个。

有两种方法来定义setter:

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;

请注意,如果结构包含指针,则setter可能需要进行一些调整。