초기화 - c++ static 변수




정적 멤버 배열 초기화 C++ (6)

나는 이렇게 정의 된 전역 배열을 사용하는 오래된 C ++ 코드를 편집하고있다.

int posLShd[5] = {250, 330, 512, 600, 680};
int posLArm[5] = {760, 635, 512, 320, 265};
int posRShd[5] = {765, 610, 512, 440, 380};
int posRArm[5] = {260, 385, 512, 690, 750};
int posNeck[5] = {615, 565, 512, 465, 415};
int posHead[5] = {655, 565, 512, 420, 370};

아래에 정의 된 Robot 클래스의 private 멤버를 모두 배열로 만들고 싶습니다. 그러나 C ++ 컴파일러는 선언 할 때 데이터 멤버를 초기화하지 못하게합니다.

class Robot
{
   private:
       int posLShd[5];
       int posLArm[5];
       int posRShd[5];
       int posRArm[5];
       int posNeck[5];
       int posHead[5];
   public:
       Robot();
       ~Robot();
};

Robot::Robot()
{
   // initialize arrays
}

Robot () 생성자에서이 6 개의 배열 요소를 초기화하려고합니다. 각 요소를 하나씩 할당하는 것 외에 다른 방법이 있습니까?


각 요소를 하나씩 할당하는 것 외에 다른 방법이 있습니까?

배열의 모든 요소를 ​​일부 기본값으로 채우려면 std::fill 사용할 수 있습니다.

#include <algorithm>

// ...
Robot::Robot()
{
    std::fill(posLShd, posLShd+5, 13 ) ; // 13 as the default value

    // Similarly work on with other arrays too.
}

배열의 각 요소를 다른 값으로 채워야하는 경우 각 인덱스에서 값을 할당하는 것이 유일한 옵션입니다.


Stefaanv의 의견에 동의하지만, 이전에는 전 세계적이었던 경우 정적으로 설정하면 "쉬운 할당"을 얻을 수 있었고 마치 정적 정적 const 일 수 있습니다.

이러한 값이 가끔 변경되는 경우 재 컴파일을 피할 수 있도록 클래스를 만들 때 외부 파일에서 값을 읽는 것이 좋습니다.

또한 고정 배열 대신 std :: vector를 사용하여 일부 기능을 사용할 수도 있습니다.


내가 여기서 뭔가를 놓치고 있니? 아래 코드가 작동합니다. 간단히 멤버를 선언하고 바로 초기화하십시오.

#include <iostream>

class Robot {
  public:
  int posLShd[5] = {250, 330, 512, 600, 680};
  int posLArm[5] = {760, 635, 512, 320, 265};
  int posRShd[5] = {765, 610, 512, 440, 380};
  int posRArm[5] = {260, 385, 512, 690, 750};
  int posNeck[5] = {615, 565, 512, 465, 415};
  int posHead[5] = {655, 565, 512, 420, 370};
  public:
    Robot() {}
    ~Robot() {}
};

int main () {
  Robot obj;
  for (int i = 0;i < 5;i++) {
    std::cout << obj.posRArm[i] << std::endl;
  }
}

당신은 그것을 정적으로 만들거나 C ++ 0x에 도입 된 새로운 초기화를 사용할 수있다.

class Robot
{
private:
  int posLShd[5];
  static int posLArm[5];
  // ...
public:
  Robot() :
    posLShd{250, 330, 512, 600, 680} // only C++0x                                                                                     
  {}

  ~Robot();
};

int Robot::posLArm[5] = {760, 635, 512, 320, 265};

전역 변수를 코드에두고 memcpy ()를 사용하여 로컬 배열을 초기화하고 전역 배열의 내용을 로컬 배열에 복사합니다.


// class definition with incomplete static member could be in a header file
Class Robot {
    static const int posLShd[5];
....
// this needs to be placed in a single translation unit only
const int Robot::posLShd[5] = {250, 330, 512, 600, 680};




default-constructor