2016-08-25 7 views
-5

私はいくつかのグラフ構造(接尾辞ツリー)のクラスをコーディングする過程にあります。この困難なことに遭遇しました。その親、およびその息子へのポインタのセット。私はメモリでエラーを回避するためにスマートポインタを使用して、ここでの事であるのです。私はこの事のための用語があると思いTのメンバーは、テンプレート引数Tを持つテンプレートクラスのインスタンス化です

class node { 
    ... 
    std::shared_ptr<node> parent; 
    ... 
}; 

を書きます。自己参照のように、または何でも。私がそれを書いたとき、私は自信を持っていました。エラーがありますが、それはうまくコンパイルされていませんでした。私は好奇心が強い、私はそれのようなものを書くことができます:

class some_class_2{ 
    ... 
    std::vector<some_class_2> some_vector; 
    std::string string_; 
    some_class() { 
     string_ = "lol"; 
     some_vector = std::vector<some_class>(10); 
    } 
}; 

この質問の答えははいと思われる。だから、私は正常にコンパイルされたテストプログラムを起動したが、もちろん止まらないかもしれない。多分私は十分ではなく、メモリ関連のエラーが出るはずだ。

これはC++でこのようなことをどのように処理すべきかということです。 C++で許可されていることが奇妙なのではないですか? some_classの中にstd :: shatre_ptrを置くのは普通ですか? some_class_2のようなエラーが回避され、 のグラフ構造を表現する最良の方法は何ですか?

答えて

1

言語はnodeの定義の中node任意の使用を許可しなかった場合は、そのようなリストやツリーなどのリンクされたデータ構造を作成する方法はありません。次いでnodeオブジェクトが含まれてしまうため

struct node { 
    int key; 
    node next; 
}; 

:言語が有用であるために、それはこのような構築できるようにするがあります一方

struct node { 
    int key; 
    node* next; 
}; 

を、言語は、この許可することができません無限の入れ子配列nodeオブジェクトであり、無限に大きくなります。

言語がこれを処理する方法は、クラスのメンバーだけがタイプになるようにすることです。完全な型のサイズは知られています。完全な定義が見られるまで、クラス型は完全ではありません。だからnodeの内部には独自の定義なので、nodeのメンバーをnodeのオブジェクトに入れることはできません。ただし、nodeがまだ完成していない場合でも、node*は完了です。

一部の標準ライブラリテンプレートを完全型で使用できます。スマートポインタstd::unique_ptr<T>,std::shared_ptr<T>、およびstd::weak_ptr<T>は、ポインターの意味を持つため、不完全なTを持つことができます。ただし、std::vectorではありません。はテンプレートパラメータが不完全で、結果は未定義の動作です。これを避ける方法はちょうどに書くことです(それはそれほど難しくありません)。

+0

ありがとう、本当にすべてを明確にしています。 – Bars

+0

@Bars問題を解決した場合は、この回答を受け入れてください – Brian

関連する問題