2016-11-24 4 views
0

これは、そのコード行にまだ存在しないオブジェクトが含まれているため、接続ベクトルを持つことができないことがわかります。頂点はまだ存在しないので、私は順序を入れ替えることができません。他のオブジェクトのポインタのベクトルを含むオブジェクト

struct Vertex { 
    int key; 
    int val; 
    vector<Edge*> connections; 
    Vertex(int k) { 
     key = k; 
    } 

}; 


struct Edge { 
    Vertex *start; 
    Vertex *end; 
    int weight; 
    Edge(Vertex *s, Vertex *e, int w) { 
     start = s; 
     end = e; 
     weight = w; 
    } 
}; 

私の解決策は、新しいオブジェクトを作成し、そこに接続を配置することです。

struct Node { 
    int key; 
    int val; 
    Node(int k) { 
     key = k; 
    } 

}; 


struct Edge { 
    Node *start; 
    Node *end; 
    int weight; 
    Edge(Node *s, Node *e, int w) { 
     start = s; 
     end = e; 
     weight = w; 
    } 
}; 

struct Vertex { 
    Node node; 
    vector<Edge*> connections; 
}; 

3つではなく2つのオブジェクトを保存する必要がある場合は、より良い方法がありますか?

答えて

3

は、あなただけの転送-宣言する必要がありEdge:私は私がSTD内部で想定しているため、ベクトル内のクラスへのポインタを格納するときに宣言することは十分であった前方考え、この問題に遭遇しました

struct Edge; 

struct Vertex { 
    int key; 
    int val; 
    vector<Edge*> connections; 
    Vertex(int k) { 
     key = k; 
    } 
}; 
+0

::ベクトルはちょうどそれへのポインタを保持していましたが、私の場合はそれは私をさせませんでした。私はそれがアロケータのサイズを知る必要があるかどうかわからない。 – Zebrafish

+0

コンテナ宣言または関数宣言で使用されるポインタまたは参照型を宣言する場合は、それを使用する前に型を定義する必要があります。それはあなたに起こった可能性があります。または、明示的にデストラクタを定義しなくても、前方宣言されたテンプレート型を持つ 'std :: unique_ptr'クラスメンバを持つという罠に陥っているかもしれません(その場合、デストラクタはデフォルトであり、前方宣言型)。 – paddy

関連する問題