2010-10-09 86 views
0

我目前已開始我的學期項目,爲我的編程課程 - 編程一個完全自主駕駛模擬器。所有的汽車都通過人工智能操控,地圖在控制檯上打印。第一張表格希望我們創建幾個基本類:FCCompact(汽車),掃描儀(AI),ID(地形)和世界(地圖)。問題實現功能與現有的班級設計

掃描儀目前在我FCCompact類爲 「HAS-A」 來實現,像這樣:

// FCCompact.h 
class FCCompact 
{ 
private: 
    struct fImpl; 
    fImpl *fImpl_; 
/* ... */ 

// FCCompact.cpp 
struct fImpl 
{ 
    Scanner scanner_; 
    /* ... */ 
}; 

有問題的掃描儀功能是

const ID& scanForID(int fovNumber,   // How far it can see 
        FCCompact::Direction dir, // Direction car is facing 
        const Location& loc);  // Location of car 

到目前爲止好。然而,整個地圖位於世界級的容器vector< deque<ID> >(1)中;我不確定如何訪問它。

到目前爲止發佈的功能都是由老師給我們的,所以他們應該能夠使用給定的參數來實現。我只是不知道該怎麼做。

我的第一個想法是打電話World::getID(Location &),但它不是靜態的。靜態的時候,它不能再訪問非靜態成員(呃,我忘記了)。我也做了一個調用非靜態函數的靜態函數;同樣的問題(雙杜)。

然後我扔了老師的指導方針,只是傳遞了整個World對象,但那也沒有效果。

我該怎麼辦?

請記住,這在技術上是家庭作業,我不希望完整的,合格的答案,甚至給我完成我想做的事情。我想盡可能地從這個項目中學習,所以請指點一下正確的方向。

(1):容器類型的奇怪選擇?我想如果世界打印在控制檯上,用矢量快速訪問每一行將是有益的,因爲不會插入或刪除隊列,並且訪問時間很精彩。

另一方面,deque方便地訪問範圍,這是有利的,因爲我會頻繁更改相鄰列(沿x或y軸行駛的汽車)。這一選擇並未迅速實現;我仍然在這個,一個列表或一個簡單的向量之間徘徊。

類世界

class ID; 
class World 
{ 
    typedef std::pair<int, int> Location; 

private:  
// vector<deque<ID> > map 
// int mapHeight, mapWidth 
// string mapName 
    struct wImpl; 
    wImpl *pimpl_; 

public: 
    World(); 
    ~World(); 

    void create(const std::string& name = "FC-City"); 

    int getHeight() const; 
    int getWidth() const; 

    ID getID(const Location& loc); 

    friend std::ostream& operator<<(std::ostream& os, World& world) 
    { 
     return os; 
    } 

private: 
    void loadMap(std::string name = "FC-City"); 

private: 
    World(const World& other); 
    World& operator=(const World& other); 
}; 

類掃描儀

class ID; 
class Scanner 
{ 
    typedef std::pair<int, int> Location; 

public: 
    Scanner(); 
    ~Scanner(); 

    const ID& scanForID(int fovNumber, 
         FCCompact::Direction dir, 
         const Location& loc); 

private: 
    Scanner(const Scanner& other); 
    Scanner& operator==(const Scanner& other); 
}; 

類FCCompact

class ID; 
class FCCompact 
{ 
    typedef std::pair<int, int> Location; 

public: 
    enum Direction 
    { 
     N, E, S, W, 
     NA = -1 
    }; 

private: 
// Scanner scanner 
// Location loc 
// Direction dir 
// ID id 
    struct FCCImpl; 
    FCCImpl *pimpl_; 

public: 
    FCCompact(const ID& id, 
       const Location& loc, 
       const Direction& dir); 

    FCCompact(const char ch, 
       const Location& loc, 
       const Direction& dir); 

    const ID& getID() const; 
    Location getLoc() const; 
    Direction getDir() const; 
    void  setDir(Direction& dir); 

    void step(); 
    void hide(); 
    void show(); 
}; 

class ID

class ID 
{ 
public: 
    enum Trait 
    { 
     Traversable, 
     NotTraversable, 
     Mobile, 
     Undef 
    }; 

private: 
    Trait trait_; 
    char appearance_; 

public: 
    ID(char outputChar, Trait trait) 
     : appearance_(outputChar), trait_(trait) 
    { } 

    ID(char outputChar) 
     : appearance_(outputChar), trait_(Trait::Undef) 
    { } 

    char getToken() const { return appearance_; } 
    Trait getTrait() const { return trait_; } 

    void setTrait(Trait trait) { trait_ = trait; } 
}; 

回答

1

Scanner應該有一個構造函數接受對World的引用;存儲一個指向該參數的指針,以便在以後需要一個擁有一個世界的世界時。

請勿使用單身人士,they're stupid。你可以使用全球化,但這裏確實沒有必要。一個Scanner需要World操作上,ERGO您有World構造它進行操作:

struct bar; 

struct foo 
{ 
    // foo cannot operate without a bar, 
    // therefore it needs to be supplied with 
    // one to be able to construct 
    foo(const bar& pBar) : 
    mBar(&pBar) 
    {} 

    void i_need_bar() 
    { 
     mBar->use_bar(); 
    } 

    bar* mBar; 
}; 
+0

啊f-這是我創建的功能,不是老師授權的功能。我利用它來破解我需要訪問地圖的功能。我不確定這是教授打算做的事情(因爲有多種可行的選擇) – IAE 2010-10-09 21:59:51

+0

@靈魂:那應該是最好的選擇。由於'getID'是非const的(它應該是const?),所以需要一個非const的'World'來處理,這意味着構造函數可能需要一個'World&'。存儲一個指針並稍後使用它。 – GManNickG 2010-10-09 22:02:47

+0

感謝您的建議! getID應該作爲一個const來實現,是的。因爲我之前改變了定義,所以我沒有將它改爲const函數。 – IAE 2010-10-09 22:08:48

1

聽起來像你想要的單身模式類World

class World { 
public: 
    static World* getWorld(); 

private: 
    static World* _singleton; 
}; 

可以初始化從你的構造和/或create()_singleton。如果您願意,getWorld()可以返回引用(或在失敗時拋出異常)。由你來思考:如果有人試圖創造多個世界?你應該在計劃結束時清理World::_singleton嗎?

+0

建議單身的事實,提出在年底這些問題應該是它產生的問題比它解決的提示。 – GManNickG 2010-10-09 21:56:38