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

问题描述 投票:2回答:3

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

c++ struct setter getter
3个回答
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
投票
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作为成员和base的默认访问。


0
投票

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

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

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

保持structTypeMyClass分开。使用getter作为:

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可能需要进行一些调整。

© www.soinside.com 2019 - 2024. All rights reserved.