2012-11-28 15 views
0

我不明白用於在構造函數initilizer中初始化數組的新C++ 11語法名單。我不再堅持使用C++ 03,但由於程序限制,我無法使用boost或std :: vector。具有多個數組的類的構造函數initilizer列表(C++ 11正常,boost和std :: vector不是)

FOO的實例必須通過構造函數調用進行調整,並且表現得像x和y的大小是靜態已知的。新的C++ 11功能是否允許這樣做?

我不確定是否或如何std::initializer_list<>可以提供幫助。

class FOO 
{ 
public: 
    // this constructor needs to size x = count and y = count * 4 
    FOO(int count) : 
    { 
     // interate over x and y to give them their initial and permenent values 
    } 
private: 
    const BAR x[]; 
    const TAR y[]; 
}; 

#include "foo.h" 
void main(void) 
{ 
    // both need to work as expected 
    FOO alpha(30); 
    FOO * bravo = new FOO(44); 
} 
+4

「必須由構造函數調用的尺寸和行爲就像x的大小和y是靜態已知」 - 你一定要明白,這些相互矛盾的要求,對不對?另外,請告訴我,「程序約束」,不允許你使用'std :: vector'。 – Xeo

+0

我同意矛盾的要求。我有大量需要可用於此類的實例的靜態只讀數據。我不希望堆或棧上的數據。我從此一直在看Marcus的問題[鏈接](http://stackoverflow.com/questions/7535743/organizing-static-data-in-c/7535953#7535953),更重要的是比爾福斯特的回覆。我的數據可能太大而無法直接放入源代碼。 > [1,000,000]。我希望有一些方法可以直接將這些記錄直接加載到內存位置的ram/rom中,我可以使用指針。 – wapadomo

+0

@wapadomo:歡迎來到[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。您詢問了有關initializer_lists和初始化的信息,但您真正想要的是將批量數據存儲在可執行文件中並獲取指針的方法。那麼你應該問過*那*。 –

回答

3

你不能做你想做的事情。數組的大小必須爲爲編譯時常量。雖然在特定用例中提供給構造函數的值可能是編譯時常量,但C++不知道這一點。此外,作爲一種靜態類型語言,C++需要能夠在編譯時計算類的大小。 sizeof(Foo)需要有一個確切的單一值。而你的不能。

初始化列表不會幫助你。你想要兩個運行時大小的數組;這就是std::vector的用途。如果你想編譯時大小的數組,你需要使用的模板類型:使用模板參數,使大小編譯時配置

template<int count> 
class FOO 
{ 
public: 
    FOO(initializer_list<Whatever> ilist) 
    { 
     // interate over x and y to give them their initial and permenent values 
    } 

private: 
    const BAR x[count]; 
    const TAR y[count * 4]; 
}; 

#include "foo.h" 
void main(void) 
{ 
    // both need to work as expected 
    FOO<30> alpha; 
    FOO<44> * bravo = new FOO<44>; 
} 
+0

模板是獲得編譯時大小數組的唯一方法嗎?如果我想在編譯時用大量數據(數百萬條BAR和TAR)初始化數組,那該怎麼辦?當然源代碼不能那麼大。 – wapadomo

+0

@wapadomo:爲什麼不呢?該模板最終沒有什麼不同於'class Foo {private:const BAR x [50000000]; ...};'一旦它被實例化。這是一個完全有效的'struct'。你是否可以通過'initializer_list'初始化初始化*這個數組的所有元素取決於你的編譯器。那麼你的編譯器可以處理擁有數百萬行代碼的源文件嗎?這個問題的答案與模板無關。 –

+0

@wapadomo:就個人而言,我會說你不應該在你的可執行文件中有數百萬靜態條目,不管你是否使用模板。爲什麼不加載文件? –

0

除了從尼科爾流星錘的回答,您還可以在堆中分配內存:

class FOO 
{ 
public: 
    // this constructor needs to size x = count and y = count * 4 
    FOO(int count) : x(new BAR[count]), y(new TAR[count]) 
    { 
     // interate over x and y to give them their initial and permenent values 
    } 

    // Need a destructor to free the memory we allocated in the constructor 
    ~FOO() 
    { 
     delete [] y; 
     delete [] x; 
    } 
private: 
    const BAR* x; 
    const TAR* y; 
}; 
+3

*現在*你進入了三條規則的整個交易......而你在答案中甚至沒有提及它。 – Xeo

+1

不僅如此,如果'新的TAR [count]'拋出,這段代碼當前會泄漏內存。基本上,如果你想要走這條路線,最好的辦法就是重新實現'std :: vector'或者類似的東西。 – Mankarse

相關問題