1

ベクトルであるプライベート属性を持つクラスがあります。次のように、コンストラクターで null で初期化しています。

Graph(int NumberOfVertices):vertices(NumberOfVertices),             
                                    edges(0),
                                    adjacency_list(NULL){};

ベクトルは

std::vector<Edge *> adjacency_list;

プログラムは動作しませんが、これがエラーであるかどうかはわかりません。私がやっているようにベクトルを正しく初期化していますか?

4

2 に答える 2

2

クラスで空のベクターフィールドを初期化しないでください。ベクターのデフォルトコンストラクターで十分です。ただし、要素の数がすでにわかっている場合は、コンストラクターでサイズを変更できます。

Graph(int NumberOfVertices):vertices(NumberOfVertices),             
                                    edges(0) { adjacency_list.resize(vertices)};

これは間違いなく間違っています:

adjacency_list(NULL) // this will evaluate to vector(0) 
                     // and your vector has 0 size

おそらく、ベクトルが格納するポインターをベクトル自体と混同した可能性があります。NULL でクラス ベクトルを初期化すると、サイズが 0 のベクトルに評価されます。クラスメンバーである空のインスタンスを初期化する必要はありませんvector:

デフォルトの初期化は、次の 3 つの状況で実行されます。

1) 自動保存期間を持つ変数が初期化子なしで宣言されている場合

2) 動的保存期間を持つオブジェクトが、初期化子なしの new 式によって作成された場合

3) 基本クラスまたは非静的データ メンバーがコンストラクター初期化子リストに記載されておらず、そのコンストラクターが呼び出された場合。<<< あはは

デフォルトの初期化の影響は次のとおりです。

T がクラス型の場合、既定のコンストラクターが呼び出されて、新しいオブジェクトの初期値が提供されます。

T が配列型の場合、配列のすべての要素はデフォルトで初期化されます。それ以外の場合は、何も行われません。

T が const 修飾された型である場合、ユーザー提供の既定のコンストラクターを持つクラス型である必要があります。

于 2013-11-03T11:44:57.613 に答える
1

ベクターの最初の要素を NULL で初期化する場合は、次のコンストラクターを使用します。

explicit vector ( size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type() );

次の方法で:

adjacency_list( 1, NULL )
于 2013-11-03T12:18:40.843 に答える