생성자 이니셜 라이저에서 멤버 배열 초기화
class C
{
public:
C() : arr({1,2,3}) //doesn't compile
{}
/*
C() : arr{1,2,3} //doesn't compile either
{}
*/
private:
int arr[3];
};
그 이유는 배열이 =
구문으로 만 초기화 될 수 있다는 것입니다.
int arr[3] = {1,3,4};
질문
- 내가 원하는 일을 어떻게 할 수 있습니까 (즉, 생성자에서 배열을 초기화 합니다 (본문에 요소를 할당하지 않음)). 가능할까요?
- C ++ 03 표준은 ctor 이니셜 라이저에서 집합체 (배열 포함)를 초기화하는 것에 대해 특별한 언급이 있습니까? 아니면 위 코드의 무효가 다른 규칙의 결과입니까?
- C ++ 0x 이니셜 라이저 목록이 문제를 해결합니까?
추신 : 벡터, boost :: arrays 및 내가 잘 알고있는 배열에 대한 우월성은 언급하지 마십시오.
- 내가 원하는 일을 어떻게 할 수 있습니까 (즉, 생성자에서 배열을 초기화합니다 (본문에 요소를 할당하지 않음)). 가능할까요?
예. 배열을 포함하는 구조체를 사용하고 있습니다. 당신은 이미 그것에 대해 알고 있다고 말했지만 나는 질문을 이해하지 못합니다. 그런 식으로, 당신은 할 몸에 할당하지 않고, 생성자의 배열을 초기화합니다. 이것이하는 일 boost::array
입니다.
C ++ 03 표준은 ctor 이니셜 라이저에서 집합체 (배열 포함)를 초기화하는 것에 대해 특별한 언급이 있습니까? 아니면 위 코드의 무효가 다른 규칙의 결과입니까?
mem-initializer는 직접 초기화를 사용합니다. 그리고 8 항의 규칙은 이런 종류의 것을 금지합니다. 다음 경우에 대해 정확히는 모르겠지만 일부 컴파일러에서는 허용합니다.
struct A {
char foo[6];
A():foo("hello") { } /* valid? */
};
자세한 내용은 이 GCC PR 을 참조 하십시오.
C ++ 0x 이니셜 라이저 목록이 문제를 해결합니까?
예, 그렇습니다. 그러나 귀하의 구문이 유효하지 않은 것 같습니다. 목록 초기화를 시작하려면 중괄호를 직접 사용해야합니다.
struct A {
int foo[3];
A():foo{1, 2, 3} { }
A():foo({1, 2, 3}) { } /* invalid */
};
C ++ 98은 배열을 0으로 만드는 것 (또는 POD가 아닌 요소의 경우 값 초기화) 외에는 직접 구문을 제공하지 않습니다. 그것을 위해 당신은 C(): arr() {}
.
나는 Roger Pate가 C ++ 0x 집계 초기화의 제한 사항에 대해 틀렸다고 생각하지만, 조회하거나 확인하기에는 너무 게으르고, 중요하지 않습니다. 편집 : Roger가 "C ++ 03"에 대해 이야기하고 있었는데 "C ++ 0x"로 잘못 읽었습니다. 미안 해요, 로저. ☺
현재 코드에 대한 C ++ 98 해결 방법은 배열을 a에 래핑하고 struct
해당 유형의 정적 상수에서 초기화하는 것입니다. 데이터는 어딘가에 있어야합니다. 커프에서 다음과 같이 보일 수 있습니다.
class C
{
public:
C() : arr( arrData ) {}
private:
struct Arr{ int elem[3]; };
Arr arr;
static Arr const arrData;
};
C::Arr const C::arrData = {{1, 2, 3}};
해결 방법 :
template<class T, size_t N>
struct simple_array { // like std::array in C++0x
T arr[N];
};
class C : private simple_array<int, 3>
{
static simple_array<int, 3> myarr() {
simple_array<int, 3> arr = {1,2,3};
return arr;
}
public:
C() : simple_array<int, 3>(myarr()) {}
};
- 아니, 안타깝게도.
- You just can't in the way you want, as it's not allowed by the grammar (more below). You can only use ctor-like initialization, and, as you know, that's not available for initializing each item in arrays.
- I believe so, as they generalize initialization across the board in many useful ways. But I'm not sure on the details.
In C++03, aggregate initialization only applies with syntax similar as below, which must be a separate statement and doesn't fit in a ctor initializer.
T var = {...};
How about
...
C() : arr{ {1,2,3} }
{}
...
?
Compiles fine on g++ 4.8
You want to init an array of ints in your constructor? Point it to a static array.
class C
{
public:
int *cArray;
};
C::C {
static int c_init[]{1,2,3};
cArray = c_init;
}
참고URL : https://stackoverflow.com/questions/4057948/initializing-a-member-array-in-constructor-initializer
'program tip' 카테고리의 다른 글
Ruby의 번 들러 / Perl의 상자에 해당하는 Python은 무엇입니까? (0) | 2020.09.04 |
---|---|
API 문서 함수 매개 변수를 해석하는 방법은 무엇입니까? (0) | 2020.09.04 |
Javascript가 포함 된 HTML 파일을 편집하기 위해 emacs를 어떻게 구성합니까? (0) | 2020.09.04 |
65 개 요소로 구성된 배열을 선언하는 것보다 1000 배 빠른 64 개 요소로 여러 배열을 선언합니다. (0) | 2020.09.04 |
C # 멤버 변수 초기화; (0) | 2020.09.04 |