2014-09-25 2 views
2

최대 크기보다 작은 바운드가있는 배열을 생성자에 전달하고 개인 데이터 멤버를 초기화 할 수 있기를 원합니다. 문제는 error: invalid initializer for array member 'option Program::long_options [10]' 또는 error: no matching function for call to 'Program::Program(const char [8], option [4], const char [5])'입니다. 유일한 방법은 쓸모없는 항목으로 생성자에 전달하는 배열을 패딩하는 것입니다.어떻게 생성자에서 배열을 초기화합니까?

class Program 
{ 
public: 
    Program(const char* pn, const option (&lo)[MAX_OPTS], const char* os); 
private: 
    option long_options[MAX_OPTS]; 
}; 

Program::Program(const char* pn, const option (&lo)[MAX_OPTS], const char* os) 
    : program_name(pn), long_options(lo), opt_string(os) 
{ 
} 

option ex_lo[] = { 
    { "help", no_argument,  nullptr,    'h' }, 
    { "verbose", no_argument,  &helpdata.verbose_flag, 1 }, 
    { "output", required_argument, nullptr,    'o' }, 
    LONG_OPTION_ZEROS 
}; 
Program example("example", ex_lo, "hvo:"); 

는 또한 벡터를 사용하여 시도했지만 같은 문제로 실행 한 :

std::vector<option> long_options; 
}; 

Program::Program(const char* pn, option (&lo)[MAX_OPTS], const char* os) 
    : program_name(pn), long_options{std::begin(lo), std::end(lo)}, opt_string(os) 
{ 
} 
+0

'std :: vector' 또는'std :: array' –

답변

0

ex_lolong_options이 두 가지 배열입니다. 당신은 다른 사람을 만들 수 없습니다.

당신이 할 수있는 일 :

  • 복사 lolong_options로. - 또는 -
  • long_options을 배열에 대한 포인터 (또는 생각할 때 참조)로 만듭니다. 이렇게하면 생성자에서 할당을 그대로 유지할 수 있습니다.
1

언어를 사용하면 다른 배열을 사용하여 배열을 초기화 할 수 없습니다.

int arr1[] = {10, 20}; 
int arr2[] = arr1 // Not allowed. In this context, arr1 evaluates to `int*`. 

이렇게하면 클래스의 배열 멤버 변수가 다른 배열의 초기화 프로그램 목록에서 초기화되지 않습니다.

배열 멤버 변수의 내용을 채우는 유일한 방법은 해당 구성 요소의 값을 생성자 본문 내에서 하나씩 설정하는 것입니다.

회원 변수에 std::vector 또는 std::array을 사용하면 수업을보다 쉽게 ​​구현할 수 있습니다.

0

어쩌면 대신

option long_options[MAX_OPTS]; 

프로그램 클래스의 객체가 동등해야 [] ex_lo 삶 옵션의 경우 시간에 사용

option *long_options; 

.

P. 미안 해요 내 영어에 대한, 나는 배우고있어 :)

관련 문제