2014-09-25 341 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' – 2014-09-25 17:02:48

回答

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::vectorstd::array作爲成員變量,使您的類更容易實現。

0

也許代替

option long_options[MAX_OPTS]; 

在生命選項這種情況下,時間ex_lo []和程序類的對象必須是平等使用

option *long_options; 

P.S.對不起我的英語,我正在學習:)