2016-10-22 21 views
3

私はランダムダンジョンクローラーを作成する必要がある学校プロジェクトを持っています。私はC++にはかなり新しく、エラーがありますが、問題の内容はわかりますが、正確に解決する方法はわかりません。ここでクラス "classname"にはメンバー "function"がありません

はものです:私の商工会議所クラスで

私はDungeonLayerクラスへのポインタをしたいです。しかし、DungeonLayer.hにChamber.hを含めることはできません.DungeonLayer.hにChamber.hが既に含まれているので例外が発生するからです。

DungeonLayerクラスをChamberクラスからアクセスできるようにするにはどうすればよいですか?

ファイル:

DungeonLayer.h

#pragma once 
#include <vector> 
#include "Chamber.h" 

class DungeonLayer { 

public: 
    DungeonLayer(std::string text, int l); 
    Chamber findChamber(int x2, int y2); 
    std::vector<Chamber> chambers; 
    void generateDungeonLayer(); 
    bool chamberExists(int x2, int y2); 
}; 

私はDungeonLayer(層)のポインタを設定し、私は上の関数を呼び出したいときはいつでもChamber.h

#pragma once 
#include <vector> 
#include "Enemy.h" 
#include "Hero.h" 

class DungeonLayer { 

}; 

class Chamber { 

public: 
    Chamber(std::vector<Chamber>* dungeonLayer, int ammountOfChambers); 
    DungeonLayer *layer; 
    Chamber *nextChamber; 
    ....... 
    Chamber* Chamber::getNextChamber(); 
    void moveToChamber(); 

private: 
    bool visited; 
}; 

それはエラーを与える:

layer->findChamber(0,0); 

エラー:

"class "DungeonLayer" has no member "findChamber" CPPAssessment Chamber.cpp" 

Chamber.hでクラスDungeonLayerはそれで何も持っていないので、これは明らかです。しかし、DungeonLayerがChamberからアクセスできるようにするにはどうしたらいいですか?

+2

のようなスマートポインタを持っているときの方法により、Cスタイルのポインタを使用しないでください。あなたがそれを前進させたいと思ったら、それはあなたがそれをやる方法ではありません。 – krzaq

+0

どういう意味ですか?私はDungeonlayer.hとChamber.hでDungeonLayerを宣言しましたか? – Jelmer

+0

いいえhttp://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-declaration – krzaq

答えて

2

問題を正しく理解していれば、これはResolve header include circular dependenciesと同じ問題です。

これは循環依存と呼ばれます。彼らはお互いを含んでいます。それはchamber.hで次のようになりますので、この場合は、前方の商工会議所でDungeonLayerを宣言:

class DungeonLayer; 


class Chamber { 
public: 
Chamber(std::vector<Chamber>* dungeonLayer, int ammountOfChambers); 
DungeonLayer *layer; 
Chamber *nextChamber; 
....... 
Chamber* Cha 
} 

この方法をあなたはそれがDungeonLayerを知っているコンパイラに指示しますが、それを含める必要がdoesntの。それを呼び出すには、DungeonLayerを知る必要があります。これは、それをchamber.cppファイルに含めることで実現できます。それは

#include "DungeonLayer.h" 

で始まる必要がありますし、あなたが二回クラス `DungeonLayer`を定義しているshared_ptrの

+0

ありがとう!私は最後の行を探していた、それは今私にとって明らかだ – Jelmer

+1

また、私たちはまだスマートポインターを使用することはできません。しかし、チップのおかげで! – Jelmer

関連する問題