2011-10-24 6 views
2

...アレイ構造

要素クラスは、

class foo { 
private: 
    int attr; 
public: 
    foo(){attr = 10;} 
    int get_attr(){return attr;} 
    void set_attr(int a){attr =a;} 
}; 

class element_foo { 
private: 
    foo data; 
    element_foo *ptr_next; 
public: 
    element_foo(){ptr_next = NULL;} 
    element_foo(int dat){data.set_attr(dat); ptr_next = NULL;} 
    element_foo(int dat, element_foo next){ 
     data.set_attr(dat); 
     ptr_next = &next; 
    } 
    foo get_data(){return data;} 

    element_foo get_next(){return *ptr_next;} 

    void print_array(){ 
     if (ptr_next == NULL) { 
      std::cout<< data.get_attr()<<std::endl; 
     } 
     else { 
      std::cout<< data.get_attr()<<std::endl; 
      this->get_next().print_array(); 
     } 

    } 
}; 



int main (int argc, char * const argv[]) { 
    // insert code here... 
    element_foo a1(10); 
    element_foo a2(15,a1); 
    element_foo a3(20,a2); 

    a3.print_array(); 

    std::cout << "Hello, World!\n"; 
    return 0; 
} 

次のクラスのアドレスではなく、このコードを指している必要がありますそれはセグメンテーションフォールトになる...なぜ?私のミスはどこですか?

+0

セマンティック・ノート:実装しているのは、ベクトルではなくリストです。典型的には、ベクトルは、メモリ内に連続して格納された要素の動的な集まりを意味すると理解される。もちろん、あなたが望むものを意味することはできますが、他人を混乱させる可能性があります。 –

答えて

4

エラーは、このコンストラクタである:あなたがローカルのアドレスを取っている

element_foo(int dat, element_foo next){ 
    data.set_attr(dat); 
    ptr_next = &next; 
} 

ptr_next = &next;機能が終了すると、アドレスは無効です。あなたがする必要がどのような

ポインタとしてでnextを渡すことです:

element_foo(int dat, element_foo *next){ 
    data.set_attr(dat); 
    ptr_next = next; 
} 

そして、これまでメインを変更します。

element_foo a1(10); 
element_foo a2(15,&a1); 
element_foo a3(20,&a2); 

EDIT:また

、あなたができるだけ参照渡し:

element_foo(int dat, element_foo &next){ 
    data.set_attr(dat); 
    ptr_next = &next; 
} 
+0

私はアンプルを忘れてしまった... – Pella86

+0

ポインタ?なぜリファレンスではないのですか? –

+0

@Tomalak Geret'kal:私が答えたとき、それは私の心を渡りませんでした。しかし、はい、それはうまくいくでしょう。 – Mysticial

1

一時オブジェクトへのポインタを格納しているという問題があります。

nextは、」あなたがあるため、コピーすることにより、価値が渡されたa1/a2のだけコピーです。 &nextが正確にa1/a2のアドレスを参照するように、コピーを使用する必要はありません。上記の行が実行されると

     v-------- should use "const element_foo &" 
element_foo(int dat, element_foo next){ 
     data.set_attr(dat); 
     ptr_next = &next; 
    } 

// a2->ptr_next is dangling 
element_foo a2(15,a1); 

は、a2->ptr_nexta1は、 すでに破壊されている一時的なローカルオブジェクトを指していません。 したがってa2->ptr_nextはぶら下がっています。後でこのポインタを介してアクセスすると、未定義の動作が発生します。