2011-11-15 8 views
2

お互いを参照するメンバーで2つのクラスを作成しようとしています。間違ったことをやっているのか、それとも不可能なのか分かりません。誰もが...ここに私を助けることができメンバーが互いに参照しているC++クラス

Source.cpp

#include "Headers.h" 
using namespace std; 

void main() 
{ 
    Network* network = new Network(); 

    system("pause"); 
    return; 
} 

Headers.h

#ifndef Headers_h 
#define Headers_h 

#include <iostream> 
#include <vector> 
#include "Network.h" 
#include "Router.h" 

#endif 

Network.h

#include "Headers.h" 

class Network 
{ 
protected: 
    vector<Router> Routers; 
}; 

Router.h

#include "Headers.h" 

class Router 
{ 
protected: 
    Network* network; 
public: 
}; 

私は取得していたエラーは以下のとおりです。

エラーC2143:構文エラー:見つかりません ';' '<'の前
エラーC2238: ';'の前に予期しないトークンがあります。
エラーC4430:型指定子がない - 想定されています。

私はセミコロンやそのようなものを紛失していないと確信しています。プログラムが動作するのは、私がメンバーの一人を取り出す場合です。私は同様の質問を見つけようとしましたが、解決策はポインタを使用することでしたが、それは私がやっていることです、それは動作していないようです!

+0

の順番あなたがしようとして2つのファイルを持っています# –

+1

サイドノート - ヘッダファイル( 'std:vector ')のvectorの名前空間を指定する必要があります – a1ex07

答えて

4

最初のエラーは、明示的に名前空間を使用する必要があります。

std::vector<Router> Routers; 

ない "使用名前空間std;" を実行しますヘッダファイルに

その他のエラーは、後に定義されたクラスへの参照に、第1 :)

からrestultingされている、あなたは、ルータのクラスの前方宣言を行う必要がありますに

class Router; 

を入れて、あなたのNetwork.h

+0

私はベクトルメンバーを取り出し、それを 'Router * router;'に変更し、Headers.hに前方デクリメントを追加しました。しかし、まだ運がない。 –

+0

ありがとうございます、あなたの固定答えが私の問題を解決しました。私はHeaders.hではなく、Network.hに前方減速を追加する必要がありました。助けてくれてありがとう! –

+0

'std :: vector 'を定義するには、 'Router'の完全な定義が必要です。しかし 'Router.h 'の' Network'の前方定義は適切です。 –

1

ベクトルの先頭にstd::という接頭語を付ける必要があります。あなたの他の選択肢は、using namespace std;をそのファイルの先頭に置くことです。

std::vector<Router> Routers; 

または

using namespace std; 
... 
vector<Router> Routers; 
+0

'特にnamespace std'を使用しないでください。にヘッダーファイルは、それを含む他のファイルを汚染します。 – Peter

+0

@ TheBuzzSawあなたが投稿する直前に私はそれを捕まえましたが、それは私の問題を解決しませんでした。メンバーを 'Router * router; 'に変更しようとしましたが、それでも動作しません。同じエラー。 –

+0

@Peter私はヘッダーファイルに入れなければならないという意味ではありませんでした。 @SaadImran。 – TheBuzzSaw

4
  1. 使用include guards
  2. 使用Forward declaration例えば

Source.cpp

#include "Network.h" 
// using namespace std; // bad idea unless it's a quickie test program 

void main() 
{ 
    Network* network = new Network(); 

    system("pause"); 
    return; 
} 

Network.h #ifndefのは

Router.h の#define MY_NETWORK_H_INCLUDED

#include "Router.h" 
#include <vector> 
using std::vector; 
// even better is: 
//  typedef std::vector<Router> t_RouterVec; 
//  t_RouterVec routers; 

class Network 
{ 
protected: 
    vector<Router> Routers; 
}; 

    #endif // MY_NETWORK_H_INCLUDED 

をMY_NETWORK_H_INCLUDED

非常に悪いIDEA 私はこれを匂いと考えます。皆にすべてを含めるようにしています。今すぐNetwork.hまたはルータで何かを変更するたびに。あなたはすべてを再コンパイルしなければならない(そして、理想的には再テストしなければならない)! -

#ifndef Headers_h 
#define Headers_h 

#include <iostream> 
#include <vector> 
#include "Network.h" 
#include "Router.h" 

#endif 
+0

ありがとう、私は前にインクルードガードを試みた。彼らは動作しませんでしたので、インクルードガードを持つ共通のヘッダーファイルを使用しました。前方脱走については、それは私のために働く。ご協力いただきありがとうございます! –

0

コンパイルの問題:

  1. Network.hにstd :: beforeベクトルを追加してください

  2. 標準を準拠して整数を返すようにmainを修正してください。


循環参照:そのベクトルの内容とRouter.hため

Network.h参照クラスRouter クラスNetworkを参照します。これは鶏の卵のシナリオです。両方を持つことはできません。これを解決するには

私は、次のをお勧めします:

  1. はRouter.hで不透明なクラス参照のネットワークを追加します。

    Router.hはネットワークへのポインタを使用しているため、ネットワークの詳細を知る必要はなく、ネットワークがクラ​​スであることだけを知る必要があります。

    クラスNetwork;

  2. 変更

    の#includeするHeaders.h内のディレクティブを含める "Router.h"

    の#include "Network.h"

関連する問題