2011-10-23 9 views
1

各リストに最初のノード、最後のノード、およびnum_elementsがある二重リンクリストを作成しようとしています。しかし、何らかの理由で、私がUseList.cppファイルのコードをテストしようとすると、num_elementsをデフォルトとして0に設定することができません。実行するコンストラクタを取得できません

私が何を意味するかをお見せしましょう:List.hで

template <class L> 
// Print out the data in each node separated by a space. 
void List<L>::show() { 
    cout << num_elements << endl; 
    Node<L> *current_node = first; 
    while (current_node != NULL) { 
     cout << current_node->data << " "; 
     current_node = current_node->next; 
    } 
    cout << endl; 
} 

注意がいる:

template <class L> 
class List 
{ 
    private: 
     Node<L> *first; 
     Node<L> *last; 
     int num_elements; 
    public: 
     // constructors and destructors 
     List(); 
    [...] 
} 

[...] 

template <class L> 
List<L>::List() { 
    first = NULL; 
    last = NULL; 
    num_elements = 0; 
} 

[...] 

これはlist.hでダウン下showメソッドでありますnum_elementsを出力するためのcout文です。

これはUseList.cppの関連部分です。showが呼び出されると

int main (int argc, char *argv[]) { 
    cout << "-----------------------------------------" << endl; 
    cout << "----------------LIST ONE-----------------" << endl; 
    cout << "-----------------------------------------" << endl; 

    List<int> *list1; 
    srand(time(NULL)); 

    list1->show(); 
[...] 

、それは「1」を出力してくれセグメンテーションフォールトを与えます。なぜnum_elementsは "0"ではなく "1"にデフォルト設定されていますか?

私はList<L>::List() {でCOUTを行うと、何も印刷されない...(これはコンストラクタが実行されることはありませんことを意味?)の助けを

ありがとう!

答えて

3

ポインタList<int>に宣言していて、何も初期化していません。

2

List<int>オブジェクトへのポインタを作成しましたが、オブジェクトは作成していません。したがって、現在、あなたのプログラムは、ポインタが "ぶら下がっている"ため、セグメンテーションフォルトになります。 ->で逆参照しようとすると、自分のものではないメモリにアクセスしていて、失敗します。これを修正するには、単に新しいListオブジェクトを割り当てる:

List<int> *list1 = new List<int>(); 

が後でそれを解放することを忘れないでください:

delete list1; 

あなたの他のオプションは、単に動的メモリを使用しないことです。あなたがする必要がない場合は、使用しないでください。

List<int> list1; 

list1.show() 
+0

のインスタンスを作成します。ありがとうございました!私はStackOverflowが10分後に答えを受け入れるでしょう。 –

0
List<int> *list1; 

ポインタであることを宣言しlist1

List<int> *list1 = new List<int>(); 

は実際にこれが最適ですList

関連する問題