我目前已開始我的學期項目,爲我的編程課程 - 編程一個完全自主駕駛模擬器。所有的汽車都通過人工智能操控,地圖在控制檯上打印。第一張表格希望我們創建幾個基本類: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; }
};
啊f-這是我創建的功能,不是老師授權的功能。我利用它來破解我需要訪問地圖的功能。我不確定這是教授打算做的事情(因爲有多種可行的選擇) – IAE 2010-10-09 21:59:51
@靈魂:那應該是最好的選擇。由於'getID'是非const的(它應該是const?),所以需要一個非const的'World'來處理,這意味着構造函數可能需要一個'World&'。存儲一個指針並稍後使用它。 – GManNickG 2010-10-09 22:02:47
感謝您的建議! getID應該作爲一個const來實現,是的。因爲我之前改變了定義,所以我沒有將它改爲const函數。 – IAE 2010-10-09 22:08:48