2016-10-22 34 views
3

所以我有一個學校項目,我必須製作一個隨機地牢爬行器。我對C++很陌生,我有一個錯誤,我知道問題是什麼,但我不知道如何正確解決它。類「classname」沒有成員「函數」

這裏是東西:

在我商會類我想要一個指針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); 
}; 

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; 
}; 

每當我設置DungeonLayer(層)的指針,我想在調用一個函數它會給出錯誤:

示例

layer->findChamber(0,0); 

錯誤:

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

這是顯而易見的,因爲該類DungeonLayer在Chamber.h有什麼也沒有。但是我怎樣才能使DungeonLayer可以從Chamber上訪問?

+2

您曾兩次定義的類'DungeonLayer'。如果你想提前宣佈它,那不是你怎麼做的。 – krzaq

+0

你是什麼意思?我已經在Dungeonlayer.h和Chamber.h中聲明瞭DungeonLayer或者? – Jelmer

+0

第http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-claclaration – krzaq

回答

2

如果我已正確理解您的問題,則這與在Resolve header include circular dependencies中描述的問題相同。

它被稱爲循環依賴。他們都包括對方。在這種情況下,向前庭宣佈DungeonLayer所以它看起來像這樣在chamber.h:

class DungeonLayer; 


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

這樣你告訴它知道DungeonLayer編譯器,但它沒有把它列入。要打電話給你,你需要知道DungeonLayer。這可以通過將其包含在chamber.cpp文件中來實現。它應與

#include "DungeonLayer.h" 

開始順便說一下,不要使用C風格的指針,當你有智能指針一樣的shared_ptr

+0

謝謝!我正在尋找最後一行,現在對我來說很明顯 – Jelmer

+1

此外,我們不允許使用智能指針,但哈哈。但是,謝謝你的提示! – Jelmer