5

我是相當新的面向對象的C++,我試圖做一個構造這樣一個鏈表:我可以用大括號構造一個鏈表嗎?

某處在List.h我們就會有這樣的:

struct Node 
{ 
    int data; 
    Node *next; 
}; 

然後在main.cpp中,我希望能夠建立這樣的名單:

int main() 
{ 
List A({1,2,3,4,5,6});// I want the amount of numbers to indicate the size of 
//the list and the numbers to go into each node in order 
return 0;  
} 

所以我的問題是,我可以做出這樣的構造?如果是的話那麼如何?我必須使用模板嗎?我試圖找到這樣的問題在SO中回答,但他們都包括模板,我還沒有學到。如果我可以讓我的構造函數執行此操作,是否可以在不使用模板的情況下執行此操作?

+1

我認爲這在C++ 11中是可行的。 – paddy

+0

看看http://www.cplusplus.com/reference/initializer_list/initializer_list/ – payo

+0

@payo,那將是一個*模板*。 – WhozCraig

回答

2

是的,你可以這樣做(使用C++ 11)。

您需要定義一個採用std::initializer_list<int>的構造函數。 (是的,這是一個模板,但我會告訴你如何使用它:-))。

一種可能實現的std::intitializer_list<int> -constructor的看起來是這樣的:

//in class List: 
List (std::initializer_list<int> init) { 
    for (auto v : init) 
     this->emplace_back(v); 
} 

,你必須自己實施emplace_back作爲練習。 emplace_back應構建新的Node並將其附加到List。這將是一個有用的成員函數(我保證)。

可能不重要的通知: 如果emplace_back確實堆分配,此代碼可能會泄漏。在這種情況下,委託給一個將List置於有效狀態的構造函數,因此析構函數可以釋放所有分配的堆Nodes。 如果您不明白這一點,那麼對於您的應用程序來說,這很可能不會太重要。

+0

只要注意:'this->'是多餘的,但不會傷害。 –

+0

不錯。對於生產質量的代碼,最好提一下這樣一個構造函數,強烈的異常保證是可取的。也就是說,類似於[std :: uninitialized_copy](http://en.cppreference.com/w/cpp/memory/uninitialized_copy),如果引發'emplace_back',則所有先前構建的對象必須被銷燬/刪除。 – iavr

0

不是真的。我相信花括號中的數字列表將會使編譯器感到困惑。更好地聲明一個int數組並將其傳遞給一個構造函數,該構造函數需要一個int數組和一個大小變量考慮以下內容:

int aray[] = {5,6,11,22,11}; 
int size = sizeof(aray)/sizeof(int); 

MyList(size,aray); 
相關問題