2010-12-06 7 views
2

という名前のメンバーを持っていません。頂点で私はエッジで送信し、エッジを介してターゲットを変更しようとしますが、クラスEdgeのコンパイラエラーが発生していますtargetという名前のメンバーがありません。C++コンパイラのエラークラスは、頂点への参照がターゲットと呼ばれている私は、クラスと呼ばれるエッジと私のエッジクラスに <p>頂点</p>と呼ばれるクラスを持っている

私Edge.hが

#include "Vertex.h" 

class Edge 
{ 
    public: 
    Edge *data; 
    Edge *next; 
    Vertex *target; 

    Edge(); 
    Edge(Edge *x); 
    Edge(Vertex *x); 

    void print(); 

}; 

私は頂点が

g++ -g -I. -c -o Vertex.o Vertex.cpp 
In file included from Vertex.h:3, 
       from Vertex.cpp:3: 
Edge.h:10: error: ISO C++ forbids declaration of ‘Vertex’ with no type 
Edge.h:10: error: expected ‘;’ before ‘*’ token 
Edge.h:14: error: expected ‘)’ before ‘*’ token 
Vertex.cpp: In constructor ‘Vertex::Vertex(Edge*)’: 
Vertex.cpp:26: error: ‘class Edge’ has no member named ‘target’ 
Vertex.cpp:27: error: ‘class Edge’ has no member named ‘target’ 
Vertex.cpp:28: error: ‘class Edge’ has no member named ‘target’ 
+2

EdgeがEdge.cppで宣言されている場合、その宣言はVertex.cppで使用できなくなります。 – Will

+0

Vertex.cppでEdge.hを埋め込んでいますか?スタブを持つだけで、 "タイプがまだ定義されていないため、Edgeにtargetという名前のメンバがありません"というエラーが発生する可能性があります。 – Seth

+0

これらのファイルが相互に含まれている場合、本当に別々のヘッダーに入れる必要がありますか? VertexとEdgeのようなサウンドは密接に結合されているので、それらを同じファイルに保存することを検討する必要があります。 – Falmarri

答えて

1
でコンパイルしようとするとエラーがVertex.cpp

Vertex::Vertex(Edge *x) 
{ 
    name = x->target->name; 
    next = x->target->next; 
    mark = x->target->mark; 
    previous = NULL; 
    next = NULL; 
} 

でこのコードにより正確なエラーが発生しています

状況を正しく理解していれば、.htではなく、.cppにEdgeのクラス宣言があるようですnヘッダー?)。 Vertexのエラーは、コンパイラがEdgeクラスを検索するときに、Edgeヘッダー内の宣言を見つけることができない、つまり隠されているために発生します。 Edgeクラスの宣言はヘッダーファイル内にある必要があり、定義は.cppにある必要があります。これは循環依存性の良いケースであり、しばしば痛みにつながることに注意してください。あなたがそれらを壊すことができない場合参照してください。

編集:そこに正確なエラーを入れてくれてありがとう、それはかなり私たちの推測をすべて確認しました。両方のクラスが互いに見えることを確認してください。VertexにEdgeのヘッダーが含まれていることを確認してください。 Falmarriが提案したように、クラスが十分に小さい場合、それらを両方とも1つのファイルにダンプすることができます。また、これらのタイプの循環依存性を解決するためにforward declarationsを使用することを忘れないでください。クラスの外部クラスへのポインタや参照を含めると宣言できますが、クラス内の実際のオブジェクト(Edge edge;など)では機能しません。私はこの理由は、ポインタとリファレンスはアドレスなので、コンパイラは内部について知る必要はないが、実際のオブジェクトを使うためには、内部に何があるのか​​を知る必要があると考えている。

+0

Edge.cppは#includeです。 #include "Edge.h" using namespace std; エッジ::エッジ(){ データ= NULL; 次= NULL; 目標= NULL; }エッジ::エッジ(エッジ* X) {データ= xと; 目標= NULL; 次= NULL; } エッジ::エッジ(頂点* X) {対象= X。 }ボイドエッジ::プリント(){ < COUT名<< ENDL。 } –

+0

私はコマンドラインから正確なコンパイラエラーを追加しました –

+0

@John Marcus追加情報をありがとう、私はこれを順方向に宣言する別の方法で私の答えを更新しました。 – Gemini14

0

Edge.hにEdge宣言を置き、Vertex.cppにEdge.hを含めます。

0

あなたには循環的な依存関係があるようです。あなたのEdge宣言にclass Vertex *target;のような宣言されていないクラス名の前にclassを追加することで修正できます。

1

その他の答えは、2つのクラス間の循環依存性に問題があり、それを解決する方法を説明していることを正しく説明しています。

私の提案は、VertexクラスがEdgeクラスを認識しないようにすることです。エッジクラスにgetTargetVertex()メソッドとgetSourceVertex()メソッドを追加し、Vertexクラスのコピーコンストラクタのみを使用するだけです。

もちろん、このソリューションでは、使用可能なプール/エッジのリスト内のすべてのエッジインスタンスをチェックせずに、頂点をターゲットとするエッジが何であるかを知ることが難しくなります。

関連する問題