문제

좋아, 나는 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를 어떻게 작성해야합니까?

도움이 되었습니까?

해결책

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 그러나 한 가지 예외 : 멤버 및베이스의 기본 액세스로 개인 대신 공개.

각 구조 필드에 대해 getter/setter를 작성하는 것은 좋은 생각이 아닙니다. 더 나은 솔루션은 다음과 같습니다.

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

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

유지하다 structType 그리고 MyClass 분리된. getter를 다음과 같이 사용하십시오.

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;

구조에 포인터가 포함 된 경우 세터는 약간의 조정이 필요할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top