2011-03-13 158 views
0

我的任務是製作一個VectorList類,並且我對構造函數有個疑問。這是類聲明:VectorList類的構造函數

#include <iostream> 
#include <vector> 
using namespace std; 
template< typename NODETYPE > 
class VectorList 
{ 
public: 
    VectorList(); // constructor 
    ~VectorList(); // destructor 

    void insertAtFront(const NODETYPE &); 
    void insertAtBack(const NODETYPE &); 
    bool removeFromFront(NODETYPE &); 
    bool removeFromBack(NODETYPE &); 
    bool isEmpty() const; 
    void print() const; 
private: 
    vector<NODETYPE> *vList; // list data as a vector 
}; 

我認爲的構造函數我會使用vList = new std :: vector;但分配有這樣的:

template< typename NODETYPE > 
VectorList<NODETYPE>::VectorList() 
: // Fill in the missing code 
{ 
    // empty body 
} 

所以我不能把VLIST =新的std ::向量;在構造函數體中,因爲他希望它是空的。我不確定在這一點上做什麼。

+0

嘗試重新格式化您的文章,以便更容易看到您的代碼。選擇文本內容並單擊工具欄中的代碼按鈕。如果很難看到你的代碼,很難回答你的問題。 – Maz

+0

你的vList是否必須是一個指向矢量的指針?如果它不是指針,它會自動初始化爲一個空向量。 – GWW

回答

2

你的老師正在釣魚constructor initializer list。這讓構造函數運行之前初始化成員:

template< typename NODETYPE > 
VectorList<NODETYPE>::VectorList() 
    : vList(new std::vector) 
{ 
} 

這是初始化的成員,因爲它相當於在聲明時正常的變量,例如初始化的標準方法

int a(3); // Calls int constructor with 3. Note int a = 3; does same (no call to operator=) 

如果你必須聲明爲int a;一個類的成員變量,初始化不能在聲明中進行,但把它在構造函數中運行後已經創建的對象。這是真正的任務,並且使用operator=而不是對象的構造函數進行。它等效於:

int a; // Create an int 
a = 3; // Uses operator= to do assignment 

還要注意的是你在我認爲什麼是頭文件using namespace std;;這是一個壞主意,因爲它會污染任何文件的名稱空間,並可能導致名稱衝突(並因此導致微妙的錯誤)。刪除該行後,您必須在vector<NODETYPE>聲明前添加std::前綴。

最後,在你的代碼到目前爲止已經發布,沒有必要在堆上分配vList(新)時,你可以有一個常規的矢量對象作爲成員變量:

vector<NODETYPE> vList; 

這會簡化您的代碼並減少引入細微內存管理錯誤的可能性。你不再需要你的初始化列表,而且析構函數也無能爲力。此外,您不必擔心定義複製構造函數和賦值運算符以使複製和分配安全/正常工作。

+0

哦,我現在明白了。謝謝。 – robertisdude